什么可以使程序在`strace`中表现不同?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么可以使程序在`strace`中表现不同?相关的知识,希望对你有一定的参考价值。

这与https://unix.stackexchange.com/q/485682/40697有关,但我决定采用更加面向开发人员的方法。

出于某种原因,通过蓝牙串行控制台登录时,我无法在我的系统上安装软件包:

# dpkg -i /var/cache/apt/archives/openssh-server_1%3a7.4p1-10+deb9u4_armhf.deb 
dpkg: unrecoverable fatal error, aborting:
 wait for subprocess dpkg-split failed: No child processes

我试图使用strace追溯问题。然而:

# strace -e trace=fork dpkg -i /var/cache/apt/archives/openssh-server_1%3a7.4p1-10+deb9u4_armhf.deb
[...]
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=7046, si_uid=0, si_status=0, si_utime=0, si_stime=1} ---
+++ exited with 0 +++

如您所见,在strace内部运行时,进程已完成,退出状态为0(并且已安装软件包)。但是当在strace之外工作时,dpkg系统地失败了。

FWIW,当在gdb内部运行时,该过程也会失败:

# gdb /usr/bin/dpkg
(gdb) run -i /var/cache/apt/archives/openssh-server_1%3a7.4p1-10+deb9u4_armhf.deb 
Starting program: /usr/bin/dpkg -i /var/cache/apt/archives/openssh-server_1%3a7.4p1-10+deb9u4_armhf.deb
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/arm-linux-gnueabihf/libthread_db.so.1".
dpkg: unrecoverable fatal error, aborting:
 wait for subprocess dpkg-split failed: No child processes

现在我的问题:什么可以解释dpkg程序在strace内运行时表现不同?

答案

我记得这已经在互联网上讨论了:)

https://github.com/strace/strace/issues/14

基本上你可以创建一个包装器脚本,就像这样(以root身份):

dpkg_path="$(which dpkg)"
mv -v "${dpkg_path}" /usr/bin/dpkg-orig

> "{dpkg_path}" cat << 'EOF'
#!/bin/bash
# pro-tip: You could use a slow disk or an old usb stick
# if writes to /dev/null turn out to be too fast
exec strace -e trace=none -e signal=none -qq -o /dev/null /usr/bin/dpkg-orig "${@}"
EOF

chmod +x "${dpkg_path}"

dpkg现在应该在你的系统上工作。

以上是关于什么可以使程序在`strace`中表现不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥||或者在rails中表现不同? [复制]

相同的自动布局约束在纵向和横向中表现不同

为啥在具有一级索引的 MultiIndex 列的 pandas DataFrame 中表现不同?

QHash 在不同的 qt 版本中表现不同

为啥 Rust RwLock 在 fork 中表现异常?

Jackson marshal/unmarshal 在 jaxrs wildfly 15 中表现不同