Трассировка по pid, включая дочерние процессы

Я новичок в strace и хочу разветвить дочерний элемент. Поскольку я хочу сделать это как обычный пользователь, процесс, который я хочу отслеживать по его pid, должен быть дочерним по отношению к процессу трассировки (strace), поэтому мне нужно разветвить его дважды. В Баше:

( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -p $! ) 
#the sleep is for giving strace time to attach itself

Все это работает, однако я хочу также отслеживать дочерние элементы отслеживаемого процесса, и как только я добавляю переключатель -f в strace, я получаю сообщение об ошибке:

( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -fp $! ) 
#=> strace: attach: ptrace(PTRACE_ATTACH, ...): No such process

Любой совет?


person PSkocik    schedule 11.03.2015    source источник


Ответы (2)


Вы можете отслеживать все процессы своего пользователя, а не только дочерние процессы strace.

Что касается проблемы, с которой вы столкнулись, вы можете переписать команду следующим образом:

strace -f bash -c 'sleep 1; echo "Im echoed from a child of strace"'

person VolenD    schedule 12.03.2015
comment
Не на убунту не могу. У них есть чертова политика безопасности для этого. Что вы делаете, так это создаете дочерний элемент strace, запуская аргумент команды. У меня нет командного аргумента для того, что я хочу отслеживать. Я хочу контролировать филиал в более крупном наборе. Я могу добраться до этой ветки через нерест с параметром, но это снова пройдет через весь код установки. Вот почему я предпочел бы разветвление и трассировку по pid, но мне также нужно трассировать процессы, вызываемые веткой (используйте ключ -f), а не только саму ветку. Код bash просто демонстрирует проблему простыми словами. - person PSkocik; 12.03.2015
comment
Возможность отслеживать процессы, которые не являются вашими дочерними процессами, является угрозой безопасности — одно взломанное приложение уровня пользователя сможет прослушивать, что делают другие приложения, и, например, таким образом узнавать о паролях. - person PSkocik; 12.03.2015
comment
Однако это можно отключить — см. здесь: wiki.ubuntu.com/Security/Features#ptrace< /а> - person pdw; 10.04.2015
comment
@PSkocik Проблема с ошибкой No such process, похоже, исчезла в strace 4.10. - person VolenD; 12.04.2015

Проблема в том, что вам не нужен exec, пример здесь:

( ( sleep 3; sleep 10 & sleep 20 & sleep 30 )& strace -fp $! )

Вы увидите, что вы получаете трассировку всех дочерних процессов:

...
[pid   166] wait4(-1,  <unfinished ...>
[pid   174] <... nanosleep resumed> NULL) = 0
[pid   174] close(1)                    = 0
[pid   174] close(2)                    = 0
[pid   174] exit_group(0)               = ?
[pid   174] +++ exited with 0 +++
[pid   166] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 174
[pid   166] wait4(-1,  <unfinished ...>
[pid   175] <... nanosleep resumed> NULL) = 0
[pid   175] close(1)                    = 0
[pid   175] close(2)                    = 0
...

ps axf вывод (с разными PID):

  202 ?        S      0:00          \_ bash
  203 ?        S      0:00          |   \_ bash
  210 ?        S      0:00          |   |   \_ sleep 10
  211 ?        S      0:00          |   |   \_ sleep 20
  212 ?        S      0:00          |   |   \_ sleep 30
  204 ?        S      0:00          |   \_ strace -fp 203

Протестировано на Ubuntu 14.04, на пользователе без специальных разрешений и с включенной проверкой области ptrace.

person Tristan Foureur    schedule 11.04.2015
comment
При запуске без exec ` ( ( sleep 3; sleep 10 & sleep 20 & sleep 30 )& strace -fp $! ) strace: attach: ptrace(PTRACE_ATTACH, ...): операция не разрешена Не удалось подключиться к процессу. Если ваш uid совпадает с uid целевого процесса, проверьте настройку /proc/sys/kernel/yama/ptrace_scope или повторите попытку от имени пользователя root. Для получения дополнительной информации см. /etc/sysctl.d/10-ptrace.conf` Мой /etc/sysctl.d/10-ptrace.conf имеет kernel.yama.ptrace_scope = 1 (изменить это нельзя). - person PSkocik; 11.04.2015
comment
Странно, у меня тоже kernel.yama.ptrace_scope = 1, и я создал тестового пользователя только для этого без каких-либо специальных разрешений. Я получаю то же сообщение, что и вы, используя exec, потому что он разветвляется по-другому. Можете ли вы сказать мне свою точную версию Ubuntu, чтобы я мог переключить свою виртуальную машину на нее и попробовать еще раз? - person Tristan Foureur; 11.04.2015