Исходные номера строк в графике перф вызовов?

Я использую 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() те new operators вызвал (без гадания, глядя на весь исходный код функции)

PS: бинарный компилируется с -m64 -O2 -ggdb3

1 ответ

Фрагменты (полные строки) исходного кода печатаются программой perf в режиме аннотирования ( справочная страница; соответствующая часть The Perf Tutorial). использование perf annotate -s=MyFunctionили вperf report прокрутите вниз до поддерева, где ваша MyFunction является корнем дерева (строка, в которой сообщается собственное время; вы можете использовать / command для его поиска), а затем выбрать кнопку (или Enter, затем Annotate "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 report может использовать 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.

Я случайно обнаружил, что 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
Другие вопросы по тегам