我通常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()
Run Code Online (Sandbox Code Playgroud)
我想知道调用的确切MyFunction()位置new operators(不用看整个函数源代码就可以猜测)
PS:二进制与 -m64 -O2 -ggdb3
我意外地发现它在 中的记录松散perf script,但它也适用于其他命令:-Foption accepts 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
Run Code Online (Sandbox Code Playgroud)
perf以注释模式(手册页;《 Perf教程》的相关部分)打印源代码的片段(全行)。使用perf annotate -s=MyFunction或perf report向下滚动到MyFunction是树的根的子树(报告自我时间的行;您可以使用/命令进行搜索),然后选择a按钮(或Enter注释“ MyFunction”)。
在注释模式下,源代码及其行应在组装线附近可见。http://man7.org/linux/man-pages/man1/perf-annotate.1.html
此命令读取输入文件并显示代码的带注释的版本。如果目标文件具有调试符号,则源代码将与汇编代码一起显示。
Run Code Online (Sandbox Code Playgroud)-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.
性能报告可能会使用srclines进行排序(--sort=选项),但说明不清楚。它的手册页也有文档--source选项,但是显然它仅在Annotate some_function模式下使用:http : //man7.org/linux/man-pages/man1/perf-report.1.html
Run Code Online (Sandbox Code Playgroud)--source Interleave source code with assembly code. Enabled by default, disable with --no-source.
| 归档时间: |
|
| 查看次数: |
2043 次 |
| 最近记录: |