如何调试破损的通配符扩展?

问题描述 投票:0回答:1

我有一个情况,在我的自动构建中,bash的通配符扩展似乎有时无法工作(类似于这样的情况 疑问我想说的是,整个过程都是在docker容器内创建的chroot内运行的,所以可能有很多原因造成这个问题(libc坏了,shell坏了等等)。我试着用strace,但结果不能帮助我分析问题。

工作案例的第一行显示的是扩展的文件名。

$ 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 两次

我怎么能用stracegdb或者其他工具来调试呢?

bash shell
1个回答
1
投票

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

这让我发现,问题是系统调用失败。getdents,在上网查了一下,发现这是一个glibckernel的bug,与getdents返回一个64位的值有关(对于ext4系统来说,getdents可以返回非常高的值,即使目录中只有几个文件,因为这个值是一个哈希值),但调用者期望的是一个32位的值。https:/bugzilla.kernel.orgshow_bug.cgi?id=205957。

另见 https:/unix.stackexchange.comquestions528361dash-not-expanding-glob-wildcards-in-chroot。

© www.soinside.com 2019 - 2024. All rights reserved.