Valgrind не показывает номера строк, несмотря на флаг-g (на Ubuntu 11.10/VirtualBox)
Я следую "узнать C трудный путь", в частности глава о Valgrind и. Эта глава дает вам намеренно неправильную программу, чтобы показать, как работает Valgrind.
когда я запускаю упражнение под Valgrind, я не получаю номера строк в своей трассировке стека, просто "(ниже main) " для ошибок.
Я наверняка компиляция с флагом-g.
мой выход Valgrind выглядит следующим образом:
djb@twin:~/projects/Learning/C$ valgrind ./ex4
==5190== Memcheck, a memory error detector
==5190== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==5190== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==5190== Command: ./ex4
==5190==
==5190== Use of uninitialised value of size 4
==5190== at 0x4078B2B: _itoa_word (_itoa.c:195)
==5190== by 0x407CE55: vfprintf (vfprintf.c:1619)
==5190== by 0x40831DE: printf (printf.c:35)
==5190== by 0x4052112: (below main) (libc-start.c:226)
==5190==
==5190== Conditional jump or move depends on uninitialised value(s)
==5190== at 0x4078B33: _itoa_word (_itoa.c:195)
==5190== by 0x407CE55: vfprintf (vfprintf.c:1619)
==5190== by 0x40831DE: printf (printf.c:35)
==5190== by 0x4052112: (below main) (libc-start.c:226)
==5190==
==5190== Conditional jump or move depends on uninitialised value(s)
==5190== at 0x407CC10: vfprintf (vfprintf.c:1619)
==5190== by 0x40831DE: printf (printf.c:35)
==5190== by 0x4052112: (below main) (libc-start.c:226)
==5190==
==5190== Conditional jump or move depends on uninitialised value(s)
==5190== at 0x407C742: vfprintf (vfprintf.c:1619)
==5190== by 0x40831DE: printf (printf.c:35)
==5190== by 0x4052112: (below main) (libc-start.c:226)
==5190==
I am 0 years old.
I am 68882420 inches tall.
==5190==
==5190== HEAP SUMMARY:
==5190== in use at exit: 0 bytes in 0 blocks
==5190== total heap usage: 0 allocs, 0 frees, 0 bytes allocated
==5190==
==5190== All heap blocks were freed -- no leaks are possible
==5190==
==5190== For counts of detected and suppressed errors, rerun with: -v
==5190== Use --track-origins=yes to see where uninitialised values come from
==5190== ERROR SUMMARY: 22 errors from 4 contexts (suppressed: 11 from 6)
Я использую Ubuntu 11.10 в виртуальной машине VirtualBox.
Спасибо за любую помощь.
обновление
кажется, что если я вызываю функцию из main()
и эта функция содержит ошибку (например, неинициализированная переменная), то I do сделать трассировку к месту, что функция была вызвана в main()
. Однако ошибки в пределах main()
остаются неустановленными. Смотрите это вставить для примера.
7 ответов:
вывод, который вы предоставили в своем вопросе, содержит следующую строку:
==5190== Use --track-origins=yes to see where uninitialised values come from
в этом сообщении вы должны запустить
./ex4
такой:valgrind --track-origins=yes ./ex4
чтобы избежать некоторых проблем с Valgrind не может найти отладочную информацию, вы можете использовать статическое связывание:
gcc -static -g -o ex4 ex4.c
вывод Valgrind будет содержать такие сообщения, как
Uninitialised value was created by a stack allocation
:==17673== Memcheck, a memory error detector ==17673== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==17673== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==17673== Command: ./ex4 ... ==17673== Use of uninitialised value of size 4 ==17673== at 0x805CA7B: _itoa_word (in /home/user/ex4) ==17673== by 0x8049D5F: printf (in /home/user/ex4) ==17673== by 0x8048ECD: main (ex4.c:8) ==17673== Uninitialised value was created by a stack allocation ==17673== at 0x8048EFA: bad_function (ex4.c:17) ... ==17673== Use of uninitialised value of size 4 ==17673== at 0x805CA7B: _itoa_word (in /home/user/ex4) ==17673== by 0x8049D5F: printf (in /home/user/ex4) ==17673== by 0x80490BE: (below main) (in /home/user/ex4) ==17673== Uninitialised value was created by a stack allocation ==17673== at 0x8048EBE: main (ex4.c:4) ... I am -1094375076 years old. ... I am -1094369310 inches tall. ... ==17673== ==17673== HEAP SUMMARY: ==17673== in use at exit: 0 bytes in 0 blocks ==17673== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==17673== ==17673== All heap blocks were freed -- no leaks are possible ==17673== ==17673== For counts of detected and suppressed errors, rerun with: -v ==17673== ERROR SUMMARY: 83 errors from 21 contexts (suppressed: 0 from 0)
File
ex4.c
:1 #include <stdio.h> 2 3 int main() 4 { 5 int age = 10; 6 int height; 7 8 bad_function(); 9 10 printf("I am %d years old.\n"); 11 printf("I am %d inches tall.\n", height); 12 13 return 0; 14 } 15 16 int bad_function() 17 { 18 int x; 19 printf("%d\n", x); 20 }
выход Valgrind не идеален. Он идентифицирует стек фрейм (функция), содержащий неинициализированную переменную, но он не выводит имя переменной.
под управлением Linux в VirtualBox имеет никакого влияния на отчет.
Я тоже компилировал с
-g
флаг и до сих пор не получает номера строки. После удаления.dSYM
каталог для моего приложения и запуск valgrind с помощью , Я, наконец, получил номера строк.
на многих дистрибутивах версия glibc по умолчанию не содержит отладочных символов.
попробуйте установить пакет libc6-dbg.
вы должны скомпилировать его с "г" . тест ССЗ -г.испытание c-o и valgrind --track-origins=yes --leak-check=full ./ тест
обратите внимание, что запуск valgrind с --dsymutil=yes решение es только для Mac OS X.
по документам:
-- dsymutil=нет|да [нет] Эта опция актуальна только при запуске Valgrind на Mac OS X.
Mac OS X использует схему связывания отложенной отладочной информации (debuginfo). Когда объектные файлы, содержащие debuginfo связаны в a .dylib нужна или исполняемый в виде не копируется в конечный файл. Вместо, debuginfo должен быть связан вручную, запустив dsymutil, a системная утилита, на исполняемом или .dylib нужна. В результате смешанная виде находится в папке вместе с исполняемым или. dylib нужна, но с расширением .dSYM.
я преследовал эту проблему, и ни один из других ответов не работал. Мои выходные данные отображали правильные символы, но номера строк не присутствовали.
в моем случае это было связано с использованием библиотеки, о которой идет речь .zdebug сжал информацию о номере строки, и версия valgrind, которую я использовал, была старой и еще не имела необходимого патча [0].
решение состояло в том, чтобы обновить valgrind до последней версии.