Исходные номера строк в графике перф вызовов?
Я использую 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