Вопрос по performance, perf, linux – Как я могу получить перф, чтобы найти символы в моей программе

23

Когда используешьperf reportЯ не вижу никаких символов для моей программы, вместо этого я получаю вывод, подобный этому:

$ perf record /path/to/racket ints.rkt 10000
$ perf report --stdio

# Overhead   Command      Shared Object  Symbol
# ........  ........  .................  ......
#
    70.06%  ints.rkt  [unknown]          [.] 0x5f99b8        
    26.28%  ints.rkt  [kernel.kallsyms]  [k] 0xffffffff8103d0ca
     3.66%  ints.rkt  perf-32046.map     [.] 0x7f1d9be46650  

Что довольно неинформативно.

Соответствующая программа построена с символами отладки, иsysprof инструмент показывает соответствующие символы, как и Zoom, который, я думаю, используетperf под капотом.

Обратите внимание, что это на x86-64, поэтому двоичный файл скомпилирован с-fomit-frame-pointer, но это также относится и к другим инструментам.

И попробовав это с-fno-omit-frame-pointer, это не имеет никакого эффекта. Sam Tobin-Hochstadt
@BrianCain, соответствующий двоичный файл довольно большой, и, таким образом, разделение пополам не реально. Я попробую это на простой программе, так как, может быть, это тоже не сработает, и будет легче отследить. Sam Tobin-Hochstadt
Можете ли вы создать минимальный пример, который демонстрирует проблему? Начните с простого двоичного файла, который не разделяет, и делите пополам различия. Brian Cain

Ваш Ответ

8   ответов
0

я не мог видеть какой-либо символ пользовательского пространства, но я видел некоторые символы ядра. Я думал, что это проблема загрузки символов. Перепробовав все возможные решения, которые я смог найти, я все равно не смог заставить его работать.

Тогда я слабо помню, что

ulimit -u unlimited

нужно. Я попытался, и это волшебным образом сработало.

Из этой вики я обнаружил, что эта команда необходима, когда вы используете слишком много файловых дескрипторов.

https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips

моя последняя команда была

perf record -F 999 -g ./my_program

не нужно --call-graph

17

но, поскольку оно появилось в верхней части моих результатов поиска в Google, когда у меня возникла такая же проблема, я подумал, что отвечу на него здесь. После еще нескольких поисков, я нашелответ на этот связанный вопрос StackOverflow очень полезно. В моей системе Ubuntu Raring я в итоге сделал следующее:

Compile my C++ sources with -g (fairly obvious, you need debug symbols)

Run perf as

record -g dwarf -F 97 /path/to/my/program

This way perf is able to handle the DWARF 2 debug format, which is the standard format gcc uses on Linux. The -F 97 parameter reduces the sampling rate to 97 Hz. The default sampling rate was apparently too large for my system and resulted in messages like this:

Warning:
Processed 172390 events and lost 126 chunks!

Check IO/CPU overload!

and the perf report call afterwards would fail with a segmentation fault. With the reduced sampling rate everything worked out fine.

Once the perf.data file has been generated without any errors in the previous step, you can run perf report etc. I personally like the FlameGraph tools to generate SVG visualizations.

Other people reported that running

echo 0 > /proc/sys/kernel/kptr_restrict

as root can help as well, if kernel symbols are required.

@PeterCordes спасибо. Возможно, это зависит от версии и / или дистрибутива, предоставляющего его. Когда я изначально писал этот ответ, мне нужно было явно указать параметр, иначе он не работал.
Я не думаю, что вам нужен явный-g dwarf, Это просто работает, когда вы строите с-gто есть поиск информации об отладке в стандартном формате является стандартным, используя его, если он находит.
0

Вот пример вывода:

Ethans-MacBook-Pro:~ phyrrus9$ nm a.out
0000000100000000 T __mh_execute_header
0000000100000f30 T _main
                 U _printf
0000000100000f00 T _sigint
                 U _signal
                 U dyld_stub_binder
0

perf после переопределения имени моей программы черезprctl(PR_SET_NAME)

Как я вижу, ваш случай довольно похож:

70.06% ints.rkt [unknown]

Команда, которую вы выполнили (racket) отличается от одногоperf видел.

3

чтобы удалить файлы эльфов, которые содержали кэшированные символы из предыдущих сборок и что-то испортили.

Они находятся в папке ~ / .debug /

Подскажите, пожалуйста, кто сохраняет символы в этой папке ~ / .debug?
команда perf record создает там папку (упоминаетсяhere ). Но, похоже, что многие программы пишут в эту папку, поэтому вам лучше удалить только персонал, связанный с перфорированием. Поскольку вы обычно запускаете perf запись как root, она будет находиться по этому пути /root/.debug/home/username/application_name
1

что вы скомпилировали программу, используя опцию -g вместе с gcc (cc), чтобы отладочная информация создавалась в собственном формате операционной системы. Попробуйте сделать следующее и проверьте, присутствуют ли символы отладки в таблице символов.

$objdump -t your-elf 
$readelf -a your-elf
$nm -a your-elf
0

cat /proc/kallsyms, Если все адреса символов в результате все 0x000000, вы можете исправить это командойecho 0 > sys/kernel/kptr_restrict , После этого вы можете получить желаемый результатperf report

1

Если нет, пожалуйста, убедитесь, что perf кросс-компилирован, потому что perf зависит от objdump и других инструментов в наборе инструментов.

Это не кросс-скомпилированная система; построить = хост = цель. Sam Tobin-Hochstadt

Похожие вопросы