Номер строки в профилировщике процессора Google Perftools на MacOSX
Я пытаюсь профилировать некоторые программы на С++ на 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 не преобразуют адреса в имена функций.
Кто-нибудь знает, чего я здесь не хватает? Что я должен сделать, чтобы дать профилировщику правильный результат.
EDIT: дополнительная информация: это не проблема pprof или google-perftools, но больше похожее на gcc или macosx, потому что Instrument.app также показывает адреса вместо номеров строк. Я не знаком с тем, как работают отладочные символы в Mac OS X, поэтому я предпочел бы, чтобы это было что-то здесь, вместо ошибок в gcc или Mac OS X. Интересно, может ли кто-нибудь дать некоторые подсказки о том, как работает отладочная информация для Mac OS X.
Ответы
Ответ 1
Это, по-видимому, связано с рандомизацией размещения адресного пространства (ASLR), представленной в OS X 10.5
Я отправил вопрос № 562 в трекер gperftools. Вы можете отключить ASLR, передав -Wl,-no_pie
.
Кроме того, если вы не обязаны использовать gperftools
, Instruments
(поставляется с Xcode
) стоит попробовать.
Ответ 2
Я верю в эту платформу, что символы отладки остаются в файле .o, они не перемещаются в исполняемый файл. Чтобы получить символы в gdb или профилировщиках, вам нужно сохранить файлы .o. Это может означать, что вам нужно скомпилировать ваше приложение в два этапа (скомпилировать, затем связать), чтобы сохранить файлы .o.
Дополнительную информацию см. этот вопрос.
При взгляде на исходный код pprof Perl имена символов получаются с использованием nm
и c++filt
, поэтому вы можете попытаться запустить эти автономные системы и выяснить, почему они не работают. Из источника pprof похоже, что он пытается собрать несколько аргументов командной строки для покрытия нескольких версий nm. Это краткое изложение способов
nm [-D] -n [-f] [--demangle] object-file 2 > /dev/nul [| каст + ФИЛТР]
Части, которые я вставляю в скобки, это те, которые script определяет во время выполнения, если они необходимы для вашей платформы и версий nm и С++ filt. Попробуйте все комбинации выше и посмотрите, что работает. Затем посмотрите, что делает pprof script, возможно, добавив к нему некоторые printfs.
Удачи.