如何调试损坏的通配符扩展



我有一种情况,bash的通配符扩展有时似乎在我的自动构建中不起作用(这与这个问题类似,整个过程都在docker容器中创建的chroot中运行,所以可能有很多原因导致它被破坏(损坏的libc、损坏的shell等(,但这个结果并不能帮助我分析这个问题。

工作案例的第一行显示了扩展的文件名:

$ ls /tmp/
linux-image-4.9.124.deb
$ strace ls /tmp/linux*deb
execve("/bin/ls", ["ls", "/tmp/linux-image-4.9.124"...], [/* 23 vars */]) = 0
...

失败的案例表明*没有得到扩展:

$ ls /tmp/
linux-image-4.9.124.deb
$ strace ls /tmp/linux*deb
execve("/bin/ls", ["ls", "/tmp/linux*deb"], [/* 23 vars */]) = 0
...

set -o在两种情况下均显示noglob off

例如,我如何使用strace/gdb或任何其他工具进行调试?

我用构建系统调用chroot的方式编写了一个最小的python脚本,然后我运行了strace -f -v script.py

这让我发现问题是一个失败的系统调用getdents,在谷歌上搜索了一点后,我发现这是一个glibc/kernel错误,与getdents返回64位值有关(对于ext4系统,即使目录中只有几个文件,getdents也可以返回非常高的值,因为该值是一个哈希值(,但调用方期望32位值:https://bugzilla.kernel.org/show_bug.cgi?id=205957

另请参阅https://unix.stackexchange.com/questions/528361/dash-not-expanding-glob-wildcards-in-chroot

最新更新