我正在尝试使用Valgrind调试我的程序。我用-g3 -O0 -ggdb
编译。我怎么也看不到与Valgrind发现问题相对应的源代码。输出只显示(二进制)库的名称。
答案 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
,我可以想到两个可能的原因:
dlopen
加载,然后在退出时关闭,也可能导致当前托管内存出现问题。我假设libslm.so
是你的,所以我认为,在这两种情况下,了解您标记的线条非常重要。您是否检查过日志中的路径是否与包含调试信息的库一样? AddrScram是否与这些库链接(具有相同的确切路径)?