strace/ptrace может заставить программу отказывать?

Можно использовать who команда для обнаружения всех зарегистрированных пользователей. Существует w управляйте также доступный узнавать то же.

7
04.08.2014, 18:35
4 ответа

No, strace не должны вызывать сбой программы -

За исключением в этом несколько необычном случае:

Если она имеет ошибку, зависящую от времени исполнения , или от времени исполнения ячеек памяти .

Она может вызывать такого рода "heisenbug" - но крайне редко, потому что такой баг встречается редко, и он должен срабатывать только под действием страйса или другого инструментария. И когда вы находите гейзенбаг, это часто хорошо.

Что касается ptrace() - syscall - то это именно то, что strace делает внутри, я думаю, так это похоже на то, что strace делает внутри, я думаю. Можно просто сделать больше, чем strace при прямом использовании ptrace().


В вашем примере была бы только такая ошибка:

В примере стройс изменил бы время шагов для создания сетевого соединения. Если это вызывает проблему, то это была "проблема ожидания" - время выполнения постоянно меняется. С помощью строки , только немного больше. Но любое другое приложение могло бы изменить тайминг больше, например, запустить программу.

.
10
27.01.2020, 20:15

Я нахожу, что трассировка графических процессов часто приводит к падениям, даже на последних ОС (по крайней мере, на OpenSuse 12.3, я специально не пробовал 13.1, так как почти полностью отказался от трассировки графических процессов).

Я не могу вспомнить, чтобы трассировка неграфических процессов приводила к падениям на любых последних ОС.

1
27.01.2020, 20:15

что случится, если запустить запущенный процесс так же, как и создание сетевого сокета или что-то подобное.

Такие вещи выполняются с помощью системных вызовов , что означает, что процесс делает запрос ядра, и ядро выполняет его. Ядро также делает магию, чтобы заставить ptrace() работать. Хотя это не означает, что он не сможет перехватить себя (что было бы ошибкой), это кажется маловероятным, так как это явно одна из его целей: координировать процессы на многозадачной системе.

3
27.01.2020, 20:15

Да. Это редко, и я понятия не имею, почему, но это определенно происходит. Недавно это случилось со мной, когда я отслеживал длинную -команду «swapoff», и не было доступа к сети или чего-либо еще, что выглядело так, как будто это может / должно вызвать проблему. Тем не менее, вскоре после подключения strace процесс завершился.

>strace -p 73358
strace: Process 73358 attached
getuid()                                = 0
geteuid()                               = 0
getgid()                                = 0
getegid()                               = 0
prctl(PR_GET_DUMPABLE)                  = 1
stat("/etc/fstab", {st_mode=S_IFREG|0644, st_size=2168,...}) = 0
open("/etc/fstab", O_RDONLY|O_CLOEXEC)  = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=2168,...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f24e5cd8000
read(3, "\n#\n# /etc/fstab\n# Created by ana"..., 4096) = 2168
read(3, "", 4096)                       = 0
close(3)                                = 0
munmap(0x7f24e5cd8000, 4096)            = 0
close(1)                                = 0
close(2)                                = 0
exit_group(-1)                          = ?
+++ exited with 255 +++

Похоже, что процесс решил завершиться добровольно, но, учитывая, что он работал несколько часов до запуска страйса, я сомневаюсь, что этот выход был случайным.

Так что да, strace иногда может привести к прерыванию процесса, но это достаточно редко, когда польза от получения достоверной информации может перевешивать этот риск.

Другим вариантом в Linux может быть проверка /proc/<PID>/stack, чтобы увидеть, где процесс в данный момент заблокирован. Это безопаснее, но предоставляет меньше динамической информации.

0
15.04.2020, 15:45

Теги

Похожие вопросы