Valgrind没有显示动态库的源代码

时间:2013-11-18 11:49:03

标签: valgrind

我正在尝试使用Valgrind调试我的程序。我用-g3 -O0 -ggdb编译。我怎么也看不到与Valgrind发现问题相对应的源代码。输出只显示(二进制)库的名称。

Valkyrie screenshot

3 个答案:

答案 0 :(得分:2)

这些地址无关紧要。它们属于在main之后运行的运行时支持代码,并调用全局对象和atexit例程的析构函数。他们没有任何与他们相关的来源(你写的)。

您可以在调用堆栈中的exit__cxa_finalize之间放置它们。没有用户代码可能属于那里。

答案 1 :(得分:0)

愚蠢的问题,但你有那个图书馆的来源吗?如果没有,并且该库未使用调试符号进行编译,则valgrind不会对二进制文件进行反编译并向您显示源代码。

答案 2 :(得分:0)

Valgrind在退出时抱怨双倍免费。这一行:

Address 0x5980ec0 is 0 bytes inside a block of size 29 free'd

指向您之前释放此内存块的位置。考虑到这也在exit,我可以想到两个可能的原因:

  • 一些已被释放的全局和静态变量(使用C ++我在使用默认复制构造函数直接分配包含指针的两个全局对象时看到了这个问题。由于两个指针都指向相同的内存地址,因此在退出时,这是两次获释。
  • libslm.so已使用dlopen加载,然后在退出时关闭,也可能导致当前托管内存出现问题。

我假设libslm.so是你的,所以我认为,在这两种情况下,了解您标记的线条非常重要。您是否检查过日志中的路径是否与包含调试信息的库一样? AddrScram是否与这些库链接(具有相同的确切路径)?