Valgrind没有显示行号,尽管-g标志(在Ubuntu 11.10 / VirtualBox上)

时间:2012-02-17 00:45:11

标签: c valgrind

我正在关注'艰难学习C',特别是the chapter on Valgrind。本章为您提供故意错误的程序,以展示Valgrind的工作原理。

当我在Valgrind下运行练习时,我没有在我的堆栈跟踪中获取行号,只是'(在主要下方')的错误。

肯定使用-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)

我在VirtualBox VM中使用Ubuntu 11.10。

感谢您的帮助。

更新

似乎如果我从main()调用一个函数并且该函数包含一个错误(例如一个未初始化的变量),那么我获取一个函数被调用的地方的跟踪在main()。但是main()内的错误仍未指定。有关示例,请参阅this paste

7 个答案:

答案 0 :(得分:56)

您在问题中提供的输出包含以下行:

==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)

档案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的输出并不理想。它标识包含未初始化变量的堆栈帧(函数),但它不打印变量的名称。

在VirtualBox下运行Linux对Valgrind没有影响。

答案 1 :(得分:16)

我也正在使用-g标志进行编译,但仍未获得行号。删除我的应用程序的.dSYM目录,并使用--dsymutil=yes选项运行valgrind后,我终于得到了行号。

答案 2 :(得分:2)

在许多发行版中,glibc的默认版本不包含调试符号。

尝试安装libc6-dbg软件包。

答案 3 :(得分:1)

你应该用&#34; -g&#34;编译它。 。  gcc -g test.c -o test 然后 valgrind --track-originins = yes --leak-check = full ./test

答案 4 :(得分:1)

请注意,使用--dsymutil = yes解决方案运行valgrind仅适用于Mac OS X.

根据文件:

  

- dsymutil =否|是[否]      此选项仅在Mac OS X上运行Valgrind时相关。

     

Mac OS X使用延迟调试信息(debuginfo)链接方案。   当包含debuginfo的目标文件链接到.dylib或   可执行文件,debuginfo不会复制到最终文件中。代替,   必须通过运行dsymutil,a手动链接debuginfo   系统提供的实用程序,在可执行文件或.dylib上。所结果的   组合的debuginfo放在可执行文件旁边的目录中   或.dylib,但扩展名为.dSYM。

答案 5 :(得分:0)

尝试gcc而不是cc

cc不提供行号,但gcc不提供

答案 6 :(得分:0)

我追了这个问题,其他答案都没有用。我的输出显示正确的符号,但行号不存在。

在我的情况下,这是由于有问题的库使用.zdebug压缩行号信息,我使用的valgrind版本是旧的,还没有所需的补丁[0]。

解决方案是将valgrind升级到最新版本。

[0] https://bugs.kde.org/show_bug.cgi?id=303877