为了分析大型软件动态运行时的函数调用关系,有时需要抓取其trace分析。目前一般有几种办法:
1. 对于内核,用ftrace,具体可搜索
2. 对于用户态应用程序:gprof、valgrind两个工具可以抓取函数动态调用关系
本文使用valgrind:
1. valgrind --tool=callgrind xxx
xxx代表原来你运行程序的命令,可以带着参数
2. 以上会生成callgrind.out.2328类似的文件,其中数字代表进程pid
3. 根据以上trace生成dot文件:
#gprof2dot -f callgrind -n0 -e0 ./callgrind.out.2328 >callgrind.2328.dot
其中-f指定输出格式为callgrind格式, -nX指定生成的文件忽略小于X个node的函数,例如-n10,代表函数节点小于10个的,在最终文件中不生成其相关信息,-eX代表边缘阈值,与-n类似。
4. 根据dot文件生成svg向量图
#dot callgrind.2328.dot -Tsvg -o callgrind.2328.dot.svg
以上callgrind.2328.dot.svg是向量图,可以用图片浏览软件直接打开
5.A kcachegrind打开callgrind.2328.dot
kcachegrind callgrind.2328.dot
5.B 如果在Windows下,可以用qcachegrind等类似kcachegrind的软件打开,另外在win下有人把linux下的kcachegrind编译生成了kcachegrind,可以直接使用。
生成的图如下: