【发布时间】:2018-07-18 12:20:44
【问题描述】:
我正在通过运行来跟踪应用程序:
strace -f -y -qq -z -etrace=execve,... -o app.trace ./app
有没有办法确定哪个进程产生了哪个子进程?
我的目标是构建一个图,对(子)进程的层次关系进行编码,以便进一步分析系统调用。
编辑: 这里有一个更具体的例子: 给定以下进程层次结构:
p1
|
.---.
| |
p2 p3
|
p4
我发现 p2 和 p4 使用 strace 触发了感兴趣的系统调用。 现在我想找到最近的共同祖先,在本例中是 p1。
是否可以使用strace 创建包含所有信息的转储,还是我必须并行使用ps/pstree?
EDIT2:
我无法针对我的问题使用 pstree。
pstree 似乎只给你一个快照,而且我的许多进程都非常短暂,因此无法通过反复调用 pstree 来可靠地捕获所有进程。
编辑3: 我注意到我的跟踪中有以下条目:
23901 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=23902, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
使用si_pid=23902 处理23901 记录SIGCHLD 信号。
这是否意味着进程23901 创建了子进程23902?
【问题讨论】:
-
我认为命令
pstree已经提供了您通过自己编写实用程序来获得的那种输出。请仔细检查。 -
如果转储(strace 日志?)包括 fork 系统调用并且您关注子进程,我认为您可以查看 fork 系统调用的两个返回值(一个在父进程中,一个在子进程中)创建一棵树
-
否定。生成新 child_process 的 execve 不使用 fork,成功时返回代码为零
-
更明确地说,我的应用程序不使用
fork。
标签: linux system-calls strace