如何使用 strace 跟踪子进程?
Posted
技术标签:
【中文标题】如何使用 strace 跟踪子进程?【英文标题】:How to track child process using strace? 【发布时间】:2011-05-02 11:23:52 【问题描述】:我使用strace
简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。
是否有技巧或工具可以快速找出哪个线程创建了另一个线程?或者更好的是,打印像pstree
这样的线程创建树?
【问题讨论】:
【参考方案1】:strace -f
跟踪fork()
ed 的子进程。
【讨论】:
【参考方案2】:我看不出一个简单的方法:
您可以使用 -ff
选项和 -o filename
来生成多个文件(每个 pid 一个)。
例如:
strace -o process_dump -ff ./executable
grep clone process_dump*
这将帮助您查看哪个父级创建了什么。也许这会对您有所帮助 - 至少您可以向后搜索。
【讨论】:
【参考方案3】:有一个名为strace-graph
的perl 脚本。这是version from github。它与 crosstool-ng 版本的编译器一起打包。它适用于我甚至使用跨平台。
ARM Linux 盒子。
$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133
X86_64 Linux 盒子。
$ ./strace-graph /srv/tftp/app.trc
(anon)
+-- touch /tmp/ppp.sleep
+-- killall -HUP pppd
+-- amixer set Speaker 70%
+-- amixer set Speaker 70%
+-- amixer set Speaker 70%
+-- amixer set Speaker 70%
+-- amixer set Speaker 50%
+-- amixer set Speaker 70%
`-- amixer set Speaker 50%
输出可用于帮助浏览主跟踪日志。
【讨论】:
非常好,这几乎正是我想要至少几天的东西。令人惊讶的是,我什至可以在我的 /usr/share/doc/strace/examples/ 中看到它。 感谢@mykhal,它是 Debian 和 Ubuntu 中 strace 软件包的一部分。它在我的系统上被压缩,这使得它按原样使用有点不方便。此外,该脚本需要 perl 来解码输出。【参考方案4】:要捕获单个进程的流量,您可以使用strace
,正如@stackmate 建议的那样。
strace -f -e trace=network -s 10000 -p <PID>;
或将其输出到文件中。
strace -f -e trace=network -s 10000 -o dumpfile -p <PID>
-f
用于所有分叉进程,-s
用于打印字符串大小,-o
用于将输出转储到文件中。
【讨论】:
以上是关于如何使用 strace 跟踪子进程?的主要内容,如果未能解决你的问题,请参考以下文章
9.11 strace:跟踪进程的系统调用 ltrace:跟踪进程调用库函数
RK3399平台开发系列讲解(内核调试篇)9.19strace跟踪器的使用
linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令