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

我有一个情况,在我的自动构建中,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或者其他工具来调试呢?

解决方案:

我写了一个最小的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。

给TA打赏
共{{data.count}}人
人已打赏
未分类

控制器的方法中没有捆绑的服务(autowire)。

2022-9-9 7:42:18

未分类

Tomcat显示旧版txt文件,删除工作目录,重启,检查...还是旧文件

2022-9-9 7:42:20

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索