strace связать родительский pid с дочерним pid

Я отслеживаю приложение, запустив:

strace -f -y -qq -z -etrace=execve,... -o app.trace ./app

есть ли способ определить, какой процесс породил какой child_process ?

Моя цель — построить граф, который кодирует иерархические отношения (под)процессов для дальнейшего анализа системных вызовов.

РЕДАКТИРОВАТЬ: Вот более конкретный пример: учитывая следующую иерархию процессов:

p1
|
.---.
|   |
p2  p3
    |
    p4

Я определяю, что p2 и p4 запускают интересующие нас системные вызовы, используя strace. Теперь я хотел бы найти ближайшего общего предка, в данном случае p1.

Можно ли создать дамп со всей информацией, используя strace, или мне нужно использовать параллельно ps/pstree?

РЕДАКТИРОВАТЬ2:

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

EDIT3: я заметил следующие записи в моей трассировке:

23901 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23902, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---

Процесс 23901 регистрирует сигнал SIGCHLD с помощью si_pid=23902. подразумевает ли это, что процесс 23901 создал дочерний процесс 23902?


person Gaetano    schedule 18.07.2018    source источник
comment
Взгляните на этот вопрос: superuser.com/questions/363169/   -  person Azeem    schedule 18.07.2018
comment
Я думаю, что команда pstree уже дает результат, который вы стремитесь получить, написав утилиту самостоятельно. Проверьте это подробно.   -  person Azeem    schedule 18.07.2018
comment
Если дамп (журнал strace?) включает в себя системные вызовы fork, и вы следуете за дочерними процессами, я думаю, вы могли бы посмотреть на два возвращаемых значения (одно в родительском и одно в дочернем процессе) системного вызова fork для создания дерева   -  person Mattias Wadman    schedule 18.07.2018
comment
отрицательный execve, который порождает новый child_process, не использует fork, и его код возврата равен нулю в случае успеха   -  person Gaetano    schedule 18.07.2018
comment
чтобы быть более явным, мое приложение не использует fork.   -  person Gaetano    schedule 18.07.2018
comment
execve не создает новый процесс. fork, vfork, posix_spawn и clone.   -  person Mark Plotnick    schedule 19.07.2018
comment
Если ваше приложение не использует fork, создает ли оно дочерние процессы другим способом? (например: clone)   -  person user803422    schedule 21.11.2018
comment
Создает ли он потоки в одном процессе? Что именно вы хотите отслеживать?   -  person user803422    schedule 21.11.2018


Ответы (1)


Вы должны отслеживать звонки clone. Это говорит о том, кто кого спавнит.

person user803422    schedule 21.11.2018