【发布时间】:2011-05-02 11:23:52
【问题描述】:
我使用strace 简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。
是否有技巧或工具可以快速找出哪个线程创建了另一个线程?或者更好的是,打印像pstree 这样的线程创建树?
【问题讨论】:
标签: linux multithreading strace
我使用strace 简单地附加到一个进程。该进程创建了 90 个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父线程,依此类推,一直到根进程。
是否有技巧或工具可以快速找出哪个线程创建了另一个线程?或者更好的是,打印像pstree 这样的线程创建树?
【问题讨论】:
标签: linux multithreading strace
strace -f 跟踪fork()ed 的子进程。
【讨论】:
我看不出一个简单的方法:
您可以使用 -ff 选项和 -o filename 来生成多个文件(每个 pid 一个)。
例如:
strace -o process_dump -ff ./executable
grep clone process_dump*
这将帮助您查看哪个父级创建了什么。也许这会对您有所帮助 - 至少您可以向后搜索。
【讨论】:
有一个名为strace-graph 的perl 脚本。这是version from github。它与 crosstool-ng 版本的编译器一起打包。它适用于我甚至使用跨平台。
$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133
$ ./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%
输出可用于帮助浏览主跟踪日志。
【讨论】:
要捕获单个进程的流量,您可以使用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 用于将输出转储到文件中。
【讨论】: