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

Я разрабатываю статически связанное 64-битное приложение C++ на 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

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

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

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

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


person Tyson    schedule 27.11.2012    source источник
comment
Ваша программа статически связана? Если вы сделаете 'ldd ./MyProg', выведет ли он список общих библиотек или ничего не выведет?   -  person Dave S    schedule 27.11.2012
comment
Он статически связан. Я отредактировал вопрос, чтобы уточнить это.   -  person Tyson    schedule 27.11.2012


Ответы (1)


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

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

Из часто задаваемых вопросов по Valgrind:

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

person Dave S    schedule 27.11.2012
comment
Спасибо. Я пропустил эту часть FAQ. После перехода на частичное динамическое связывание я могу получить профиль. - person Tyson; 28.11.2012
comment
Основываясь на разговоре в списке рассылки valgrind-users, valgrind должен иметь возможность анализировать статически связанные приложения, начиная с версии 3.8.1. В соответствии с просьбой в списке рассылки я сообщил об этом ошибке. - person Tyson; 03.12.2012