性能调用图中的源行号?

Sho*_*ker 5 linux perf

我通常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

Hi-*_*gel 6

我意外地发现它在 中的记录松散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)


osg*_*sgx 5

perf以注释模式(手册页《 Perf教程》的相关部分)打印源代码的片段(全行)。使用perf annotate -s=MyFunctionperf report向下滚动到MyFunction是树的根的子树(报告自我时间的行;您可以使用/命令进行搜索),然后选择a按钮(或Enter注释“ MyFunction”)。

在注释模式下,源代码及其行应在组装线附近可见。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.
Run Code Online (Sandbox Code Playgroud)

性能报告可能会使用srclines进行排序(--sort=选项),但说明不清楚。它的手册页也有文档--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.
Run Code Online (Sandbox Code Playgroud)