Как я могу получить перформанс, чтобы найти символы в моей программе
При использовании 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
, но этот случай выполняется и под другими инструментами.
Ответы
Ответ 1
Этот пост уже старше года, но поскольку он появился в верхней части моих результатов поиска Google, когда у меня была такая же проблема, я думал, что отвечу на него здесь. После некоторого поиска, я нашел ответ fooobar.com/questions/259458/..., очень полезный. В моей системе Ubuntu Raring я затем сделал следующее:
- Скомпилируйте мои источники С++ с помощью
-g
(довольно очевидно, вам нужны символы отладки)
-
Запустите perf
как
record -g dwarf -F 97 /path/to/my/program
Таким образом, perf
может обрабатывать отладочный формат DWARF 2, который используется в стандартном формате gcc
для Linux. Параметр -F 97
уменьшает частоту дискретизации до 97 Гц. Частота выборки по умолчанию была, по-видимому, слишком большой для моей системы и привела к следующим сообщениям:
Warning:
Processed 172390 events and lost 126 chunks!
Check IO/CPU overload!
и после этого вызов perf report
завершится с ошибкой сегментации. При уменьшенной частоте дискретизации все получилось отлично.
- Как только файл
perf.data
был сгенерирован без ошибок на предыдущем шаге, вы можете запустить perf report
и т.д. Мне лично нравится FlameGraph для создания визуализации SVG.
-
Другие люди сообщили, что запуск
echo 0 > /proc/sys/kernel/kptr_restrict
так как root может помочь, если нужны символы ядра.
Ответ 2
Убедитесь, что вы скомпилируете программу с помощью опции -g вместе с gcc (cc), чтобы отладочная информация создавалась в собственном формате операционной системы.
Попробуйте сделать следующее и проверить, есть ли в таблице символов отладочные символы.
$objdump -t your-elf
$readelf -a your-elf
$nm -a your-elf
Ответ 3
Как насчет вашей главной машины? Это также работает ОС x86_64?
Если нет, убедитесь, что перфоманс скомпилирован, потому что перфомант зависит от objdump и других инструментов в toolchain.
Ответ 4
Вы всегда можете использовать команду $nm.
здесь приведен пример вывода:
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
Ответ 5
У меня возникла такая же проблема с perf после переопределения имени моей программы с помощью prctl(PR_SET_NAME)
Как я вижу, ваше дело довольно похоже:
70.06% ints.rkt [неизвестно]
Команда, которую вы выполнили (ракетка), отличается от той, которую видели перф.
Ответ 6
вы можете проверить значение kptr_restrict на cat /proc/kallsyms
. Если адресами символов в результате являются все 0x000000, вы можете исправить его командой echo 0 > sys/kernel/kptr_restrict
. После этого вы можете получить желаемый результат perf report
Ответ 7
У меня тоже была эта проблема, я не видел никакого символа пользовательского пространства, но я видел некоторые символы ядра. Я думал, что это проблема загрузки символов. После проверки всех возможных решений, которые я смог найти, я все еще не мог заставить его работать.
Затем я слабо помню, что
ulimit -u unlimited
. Я старался, и это волшебно сработало.
Я нашел из этой вики, что эта команда нужна, когда вы используете слишком много файловых дескрипторов.
https://perf.wiki.kernel.org/index.php/Tutorial#Troubleshooting_and_Tips
моя последняя команда была
перфорированная запись -F 999 -g./my_program
не нужен -call-graph