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


68

我正在关注“艰难学习C”,特别是关于Valgrind的章节。本章为您提供一个故意错误的程序,以显示Valgrind的工作方式。

当我在Valgrind下运行该练习时,在堆栈跟踪中没有得到行号,只是出现了“(在main以下)”错误。

肯定在编译-g标志。

我的Valgrind输出如下:

我在VirtualBox VM中使用Ubuntu 11.10。

感谢您的任何帮助。

更新资料

看来,如果我从中调用函数,main()并且该函数包含错误(例如,未初始化的变量),那么我确实可以找到该函数在其中被调用的位置main()。但是,其中的错误main()仍然不确定。有关示例,请参见此粘贴


请创建一个新的空目录,然后将您在pastebin.com/A6bK2hdw中找到的目录放入该目录中;这是一个bash脚本,试图重现该问题。当我运行它时,我得到的输出就像在pastebin.com/JncWz2GF上看到的一样,这是您的教程说的应该得到的。自己运行。如果获得正确的输出,则确定执行此输出的方式与此Shell脚本有何不同。如果运行此Shell脚本并如上所示向我们显示不正确的输出,请返回并进行讨论。
比尔·埃文斯

嗨@比尔,谢谢您的帮助。运行脚本时,我得到相同的输出以及关于时钟偏斜的警告。http://pastebin.com/fjfPrLts
djb 2012年

3
我遇到相同的问题,相同的操作系统,相同的VirtualBox VM。我尝试了valgrind 3.6.1和3.7.0,但都没有显示带有-g选项的行号。
克里斯

1
我猜想这个问题与VirtualBox本身有关。我对VirtualBox不熟悉。我建议您将VirtualBox标记添加到您的问题中,看看是否有东西出现。如果那没有帮助,请查看forums.virtualbox.org上的人员是否可以提供帮助。希望我能提供更多帮助。抱歉。
比尔·埃文斯

1
刚刚在Mac OSX上测试了与我的Ubuntu / VBox设置相同的版本,并且在Mac上完美运行。我认为Bill可能是正确的,要么是VBox的东西,要么是Ubuntu的东西。
克里斯

Answers:


61

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

根据此消息,您应该这样运行./ex4

为了避免Valgrind无法找到调试信息的某些问题,可以使用静态链接:

Valgrind的输出将包含以下消息Uninitialised value was created by a stack allocation

档案ex4.c

Valgrind的输出并不理想。它标识包含未初始化变量的堆栈框架(函数),但不打印变量名称。

在VirtualBox下运行Linux对Valgrind无效。


17
即使您已经阅读过课程,也仍然无法解决您的问题。这个答案不能解决任何问题。教程中Valgrind的输出给出了使用未初始化变量的行。这与--track-origins = yes给出的输出有很大不同,并且由于最初的问题是如何获得与Ubuntu上的教程相同的输出,因此该问题仍应打开...完全相同的问题正在运行在Ubuntu 11.10(不通过VM)上使用valgrind 3.7.0。
贾斯汀2012年

18

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


1
这只是为OS X
Lenar霍伊特

valgrind --track-origins=yes --dsymutil=yes ./FILE_NAME在Ubuntu中做到了这一点,我用-g标志进行了编译
Minh Triet 2015年

2

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

尝试安装libc6-dbg软件包。


1

尝试gcc而不是cc

cc不提供行号,但是gcc可以提供


1

您应该使用“ -g”进行编译。gcc -g test.c -o测试然后valgrind --track-origins = yes --leak-check = full ./test


4
“我绝对在使用-g标志进行编译。” -引用OP。
DevSolar 2015年

1

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

根据文档:

- dsymutil = NO | YES [无]在Mac OS X上运行Valgrind的时,此选项才相关

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


1

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.