2010-10-25 2 views
5

Я попытался запустить valgrind (memcheck и массив) в приложении, которое я написал, но все, что я возвращаю, это адреса для выполняемых функций.Valgrind не вернет исходные строки!

--------------------------------- 
Context accounted for 0.6% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x8141740: (within prog_name) 

Called from: 
    0.6% : 0x812E077: (within prog_name) 

--------------------------------- 
Context accounted for 0.5% of measured spacetime 
    0x805F29A: (within prog_name) 
    0x81418FB: (within prog_name) 

Called from: 
    0.5% : 0x812E077: (within prog_name) 

Я составил мое приложение с флагом -g, чтобы положить отладочные символы в. Есть ли другая причина, почему Valgrind не покажет исходную строку?

EDIT: valgrind version 3.2.1-Debian; g ++ 4.3.1

+1

Не уверен, но если вы 'gdb prog_name' свое приложение и попробуйте что-то вроде' break 0x812E077', 'gdb' показывают номера строк? (Вам не нужно даже «запускать» программу, просто «gdb» загрузите ее.) – aschepler

+0

@aschepler - попробовал. Всякий раз, когда я пытаюсь это сделать, gdb не может найти функцию с именем «0x812E077» и спрашивает, находится ли она в библиотеке, которую она будет загружать позже ... так что это не сработало. –

+1

Упс, это должно было быть 'break * 0x812E077'. Но рад, что вы нашли исправление. – aschepler

ответ

8

я обнаружил, что я прошел в обоих -g и -ggdb флагов g++ во время компиляции. Опуская флаг -g, эта проблема исчезла.

1

Я полагаю, вы не указали правильные флаги и перешли с флагами по умолчанию.

--show-достижимый - это один из таких флагов, который должен быть включен, посмотрите другие флаги и включите их.

--Cheers

2

Есть несколько возможных причин:

  • вы, возможно, непреднамеренно раздели свой исполняемый файл (скорее всего, объяснение),
  • может быть выполнение JITted кода (хотя адрес не выглядит, как это случай).

Что делает file prog_name сказать? Если он говорит «лишен», это проблема. Вы также можете проверить, есть ли другие инструменты, например. GDB знать, какой символ находится по адресу 0x805F29A:

gdb prog_name 
(gdb) info symbol 0x805F29A 
+0

У меня никогда не было обнаженного сообщения. Я не знаю точно, но я подозреваю, что смешивание флагов '-g' и '-ggdb' испортило это. –

+0

@sheepsimulator Вы можете заподозрить все, что хотите, но если вы хотите, чтобы мы вам помогли, пожалуйста, предоставьте информацию, которую мы просим: что * точно * делает файл prog_name 'say? что именно означает «информационный символ» GDB? –

+0

Я ценю ваше проявление поддержки, но эта проблема исчезла, когда я опустил флаг -g во время компиляции. Я считаю, что мой вопрос ответил. –

1

Для других читателей с подобной проблемой (я была такой же, но мои параметры компилятора, где нормально): Оказывается, что Valgrind необходим путь к исполняемому файлу, если вы не давайте это, тогда он будет работать нормально, но он не даст вам номера строк. В моем случае исполняемый файл был в другом каталоге, который был в моей PATH, но, чтобы получить информацию о линии я должен был бежать

Valgrind --leak проверка = полный path_to_myprogram/MyProgram