我正在使用perf record -a --call-graph dwarf -p XXX sleep 1
来记录一些函数调用,然后perf report
来查看该数据,但如果我还能看到源行号以确切知道每个函数调用的位置,那将非常有用。制作。例如:
- 4.18% testbinary testbinary [.] malloc
- malloc
- 99.57% operator new(unsigned long)
+ 7.28% MyFunction()
我想知道调用MyFunction()
的{{1}}到底在哪里(没有我通过查看整个函数源代码猜测)
P.S。:Binary是用new operators
答案 0 :(得分:4)
源代码的片段(实线)由注释模式中的perf打印(man page; The Perf Tutorial的相关部分)。使用perf annotate -s=MyFunction
或在perf report
向下滚动到您的MyFunction是树根的子树(报告自身时间的行;您可以使用 / 命令搜索它)然后选择 a 按钮(或输入然后注释" MyFunction")。
源代码及其行应在Annotate模式下的装配线附近可见。 http://man7.org/linux/man-pages/man1/perf-annotate.1.html
此命令读取输入文件并显示带注释的版本 的代码。如果目标文件有调试符号,那么源 代码将与汇编代码一起显示。
-l, --print-line Print matching source lines (may be slow). --source Interleave source code with assembly code. Enabled by default, disable with `--no-source`. -s, --symbol=<symbol> Symbol to annotate.
Perf报告可能会在排序(--sort=
选项)中使用srclines,但说明不清楚。它的手册页也会记录--source
选项,但显然它只在Annotate some_function模式中使用:http://man7.org/linux/man-pages/man1/perf-report.1.html
--source Interleave source code with assembly code. Enabled by default, disable with --no-source.
答案 1 :(得分:2)
我偶然发现它在perf script
中有松散的文档记录,但它也适用于其他命令:-F
选项接受srcline
。因此,您可以执行-F+srcline
将行号添加到现有列中。
示例:perf report -g fractal -F+period,srcline
Samples: 22K of event 'cycles:u', Event count (approx.): 13031011295
Children Self Period Source:Line Command Shared Object Symbol
+ 99.98% 38.76% 5051224000 test.cpp:7 a a [.] fib
+ 96.42% 0.00% 0 _start+94372992700461 a a [.] _start
+ 96.42% 0.00% 0 __libc_start_main+140304673091826 a libc-2.29.so [.] __libc_start_main
+ 96.42% 0.00% 0 test.cpp:13 a a [.] main
+ 21.47% 21.47% 2797741850 test.cpp:8 a a [.] fib
+ 16.69% 16.69% 2174469736 test.cpp:4 a a [.] fib
+ 16.37% 16.36% 2132462705 test.cpp:6 a a [.] fib
+ 6.69% 6.69% 871128215 test.cpp:5 a a [.] fib