Инструмент Valgrind massif не будет профилировать мое приложение

Я разрабатываю статически связанное 64-битное приложение С++ на 64-разрядном CentOS 5.8, используя стандартные пакеты gcc 4.4 из хранилищ CentOS. Кажется, он использует больше памяти, чем я ожидал, поэтому я попробовал использовать массив, чтобы профилировать использование памяти. Я скомпилировал с информацией об отладке, а затем запустил

valgrind --tool = massif./MyProg

из каталога, в котором находится MyProg. Он никогда не дает никаких результатов, кроме следующего примера массива .out.XXXX.

desc: (none)
cmd: ./MyProg
time_unit: i
#-----------
snapshot=0
#-----------
time=0
mem_heap_B=0
mem_heap_extra_B=0
mem_stacks_B=0
heap_tree=empty

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

Я пробовал различные варианты для valgrind и массива безрезультатно. Я даже попытался использовать абсолютный путь к MyProg, на всякий случай. Я попытался загрузить самую последнюю стабильную версию valgrind (3.8.1) и компилировать и запускать ее (поскольку CentOS использует 3.5.0) с тем же результатом. Как проверка работоспособности я побежал

valgrind --tool = massif ls -l

и он произвел несколько снимков с ненулевым использованием памяти, как ожидалось.

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

В качестве дополнительной заметки я могу успешно профилировать приложение, используя инструмент memcheck по умолчанию valgrind, в случае, если это полезная информация.

Кто-нибудь знает, почему massif не сможет профилировать мое приложение?

Ответ 1

Если приложение статически связано, оно не может быть проанализировано с помощью valgrind. Valgrind работает, предоставляя свою собственную версию функций распределения вашей программе, которую она выполняет, переопределяя динамический поиск.

Если вы можете динамически связываться со стандартными библиотеками (libc и libstdС++), тогда, вероятно, он сможет выполнить анализ памяти, который вы ищете.

Из Valgrind FAQ:

Во-вторых, если ваша программа статически связана, большинство инструментов Valgrind не будут работать, потому что они не смогут заменить некоторые функции, такие как malloc, своими собственными версиями.