我使用strace
简要地附加到流程。该过程创建了90个线程。当我找到有问题的线程时,我不得不繁琐地搜索父线程,然后是祖父母线程,等等一直到根进程。
是否有一个技巧或工具可以快速找出哪个线程创建了另一个?或者更好的是,打印像pstree
这样的线程创建树?
答案 0 :(得分:93)
strace -f
用于跟踪fork()
ed。
答案 1 :(得分:17)
有一个名为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%
输出可用于帮助导航主跟踪日志。
答案 2 :(得分:16)
我看不出一个简单的方法:
您可以使用-ff
选项与-o filename
生成多个文件(每个pid一个)。
例如:
strace -o process_dump -ff ./executable
grep clone process_dump*
可以帮助您查看哪个父级创建了什么。也许那会对你有帮助 - 至少你可以向后搜索。
答案 3 :(得分:0)
要捕获单个进程的流量,您可以按照@stackmate的建议使用strace
。
strace -f -e trace=network -s 10000 -p <PID>;
或将其输出到文件中。
strace -f -e trace=network -s 10000 -o dumpfile -p <PID>
-f
用于所有分支过程,-s
用于打印字符串大小,而-o
用于将输出转储到文件中。