Подтвердить что ты не робот

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

При использовании 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, но этот случай выполняется и под другими инструментами.

4b9b3361

Ответ 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