Номер строки в профилировщике ЦПУ Google Perftools в MacOSX

Я пытаюсь профилировать некоторые программы C++ на MacOSX. Так я построил google-perftools, написал программу, скомпилированную с использованием MacPorts g++ 4.7, с -g флаг компилятора и связанный с libprofiler, Затем я побежал:

CPUPROFILE=cpu.profile ./a.out

Затем я запустил pprof для генерации вывода:

[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out.
Using local file cpu.profile.
Removing __sigtramp from all stack traces.
Total: 282 samples
     107  37.9%  37.9%      107  37.9% 0x000000010d72229e
      16   5.7%  43.6%       16   5.7% 0x000000010d721a5f
      12   4.3%  47.9%       12   4.3% 0x000000010d721de8
      11   3.9%  51.8%       11   3.9% 0x000000010d721a4e
       9   3.2%  55.0%        9   3.2% 0x000000010d721e13
       8   2.8%  57.8%        8   2.8% 0x000000010d721a64
       7   2.5%  60.3%        7   2.5% 0x000000010d7222f0
       6   2.1%  62.4%        6   2.1% 0x000000010d721a4c
       6   2.1%  64.5%        6   2.1% 0x000000010d721b1f
       6   2.1%  66.7%        6   2.1% 0x000000010d721e0c
       5   1.8%  68.4%        5   1.8% 0x000000010d721fba
    ......

Похоже, что perftools не конвертирует адреса в имена функций.

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

РЕДАКТИРОВАТЬ: Больше информации: это не проблема pprof или google-perftools, а скорее что-то вроде gcc или macosx, потому что Instrument.app также показывает адреса вместо номеров строк. Я не знаком с тем, как символы отладки работают в Mac OS X, поэтому я предпочел бы думать, что я что-то упустил здесь, вместо того, чтобы быть ошибками в gcc или Mac OS X. Интересно, может ли кто-нибудь дать некоторые подсказки о том, как работает информация отладки для Mac OS X.

2 ответа

Это, кажется, связано с рандомизацией расположения адресного пространства (ASLR), представленной в OS X 10.5

Я подал номер 562 на трекер проблем gperftools. Вы можете отключить ASLR, передав -Wl,-no_pie,

Кроме того, если вы не обязаны использовать gperftools, Instruments (приходит с Xcode) стоит попробовать.

Я полагаю, что на этой платформе символы отладки остаются в файле.o, они не перемещаются в исполняемый файл. Чтобы получить символы в GDB или профилировщиках, вам нужно сохранить файлы.o. Это может означать, что вам нужно скомпилировать ваше приложение в два этапа (скомпилировать, затем связать), чтобы сохранить файлы.o.

Смотрите этот вопрос для получения дополнительной информации.

При рассмотрении исходного кода Perl pprof имена символов получаются с помощью nm а также c++filtТаким образом, вы можете попробовать запустить эти автономные и выяснить, почему они не работают. Из источника pprof похоже, что он пытается связать несколько аргументов командной строки, чтобы охватить несколько версий nm. Это краткое изложение способов

nm [-D] -n [-f] [--demangle] объект-файл 2>/dev/nul [| каст + ФИЛТР]

Части, которые я поместил в квадратные скобки, - это те, которые сценарий определяет во время выполнения, требуются ли они для вашей платформы и версий nm и C++ Filt. Попробуйте все комбинации вышеперечисленного и посмотрите, что работает. Затем посмотрите, что делает скрипт pprof, возможно, добавив в него несколько printfs.

Удачи.

Другие вопросы по тегам