简体   繁体   中英

Source line numbers in perf call graph?

I'm using perf record -a --call-graph dwarf -p XXX sleep 1 to record some function calls then perf report to view that data, however it would be very helpful if I could also see source line numbers to know exactly where each function call was made. For example:

-   4.18%  testbinary  testbinary                [.] malloc 
   - malloc 
      - 99.57% operator new(unsigned long)
         + 7.28% MyFunction()

I want to know where exactly in MyFunction() are those new operators called (without me guessing by looking at the whole function source code)

PS: Binary is compiled with -m64 -O2 -ggdb3

Fragments (full lines) of source code are printed by perf in annotate mode ( man page ; relevant part of The Perf Tutorial ). Use perf annotate -s=MyFunction or in perf report scroll down to the subtree where your MyFunction is root of tree (line where self time is reported; you can use / command to search for it) and then select a button (or Enter then Annotate "MyFunction").

Source code and its lines should be visible near assembly lines in Annotate mode. http://man7.org/linux/man-pages/man1/perf-annotate.1.html

This command reads the input file and displays an annotated version of the code. If the object file has debug symbols then the source code will be displayed alongside assembly code.

  -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 report may use srclines in sorting ( --sort= option) but instructions are unclear. Its man page documents --source option too, but apparently it is used only in Annotate some_function mode: 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. 

I accidentally found it loosely documented in perf script , but it applies to other commands as well: -F option accepts srcline . So you can do -F+srcline to add the line number to existing columns.

Example: 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM