【问题标题】:strace associate parent pid to child pidstrace 将父 pid 关联到子 pid
【发布时间】: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:

我无法针对我的问题使用 pstreepstree 似乎只给你一个快照,而且我的许多进程都非常短暂,因此无法通过反复调用 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

【问题讨论】:

  • 看看这个问题:superuser.com/questions/363169/…
  • 我认为命令pstree 已经提供了您通过自己编写实用程序来获得的那种输出。请仔细检查。
  • 如果转储(strace 日志?)包括 fork 系统调用并且您关注子进程,我认为您可以查看 fork 系统调用的两个返回值(一个在父进程中,一个在子进程中)创建一棵树
  • 否定。生成新 child_process 的 execve 不使用 fork,成功时返回代码为零
  • 更明确地说,我的应用程序不使用fork

标签: linux system-calls strace


【解决方案1】:

您应该跟踪对clone 的调用。它告诉谁产生谁。

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2011-12-26
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多