Что может заставить программу вести себя по-другому внутри "strace"? - PullRequest
0 голосов
/ 03 декабря 2018

Это относится к https://unix.stackexchange.com/q/485682/40697, но я решил использовать более ориентированный на разработчиков подход.

По какой-то причине я не могу установить пакеты в моей системе при входе через последовательную консоль Bluetooth:

# 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?

1 Ответ

0 голосов
/ 03 декабря 2018

Я помню, что это обсуждалось в интернете раньше :)

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 теперь должно работать в вашей системе.

...