我知道这个问题,但它似乎对我不起作用.
对于设置,采用一个简单的C++程序,hw.cpp由下式给出:int main() { }
在g++ -o hw hw.cpp -O0 -gLinux上编译时,运行ldd ./hw给出:
linux-gate.so.1 => (0x003e5000)
libstdc++.so.6 => /usr/local/lib/libstdc++.so.6 (0x007c5000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x006a4000)
libgcc_s.so.1 => /usr/local/lib/libgcc_s.so.1 (0x00a40000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00a93000)
/lib/ld-linux.so.2 (0x00a0f000)
Run Code Online (Sandbox Code Playgroud)
现在我似乎也有调试库/usr/lib/debug/lib/tls/i686/cmov/,我想这是系统库的相应调试版本.
问:我如何编译我的程序,使其对调试连接建立标准的C和/或C++库,libc/ libm/ libstdc++,共享或静态的?对于共享构建,我希望输出ldd ./hw指向调试目录.
(背景:我的项目使用的一个共享库被Valgrind报告为泄漏("仍然可以访问"),但起源不在共享库本身,而是在dlopen类型代码中(参见此处).所以我我想如果我可以逐步完成_Start()CRT中的调用,我可以追查罪魁祸首.)
更新/更正:我认为我只是非常非常愚蠢 - 调试库可能始终按需要链接.我对调试器在步进时没有显示任何内容感到困惑,这是因为我没有库的源代码.
更新II:好的,保留以前的更新.我现在有了库源代码,但是虽然标准库带有调试符号,但我似乎没有单独的调试版本.这样的构建是否可用,我将如何链接它?
你如何让Valgrind准确显示错误发生的位置?我编译了我的程序(通过PuTTy在Linux终端上的Windows机器上)添加-g调试选项.
当我运行Valgrind时,我得到了Leak和Heap摘要,我肯定已经丢失了内存,但我从未获得有关它发生的位置的信息(文件名,行).在我分配内存之后,Valgrind不应该在告诉我什么线路,它以后无法解除分配?
==15746==
==15746== HEAP SUMMARY:
==15746== in use at exit: 54 bytes in 6 blocks
==15746== total heap usage: 295 allocs, 289 frees, 11,029 bytes allocated
==15746==
==15746== LEAK SUMMARY:
==15746== definitely lost: 12 bytes in 3 blocks
==15746== indirectly lost: 42 bytes in 3 blocks
==15746== possibly lost: 0 bytes in 0 blocks
==15746== still reachable: 0 bytes in 0 blocks
==15746== suppressed: 0 bytes in 0 blocks
==15746== Rerun with --leak-check=full to see details of leaked memory …Run Code Online (Sandbox Code Playgroud) 我在这里读到了一个类似的问题: Valgrind尽管没有-g标志显示行号(在Ubuntu 11.10/VirtualBox上)
但是,解决方案并没有解决我的问题.请参阅下面的valgrind输出.它没有告诉我主函数中的行号.
我的软件版本:gcc版本4.8.2(Ubuntu 4.8.2-19ubuntu1)Valgrind-3.10.0.SVN
这是源代码:
#include<stdio.h>
/* warining: this program is wrong on purpose. */
int main(){
int age = 10;
int height;
printf("I am %d years old.\n");
printf("I am %d inches tall.\n", height);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Makefile文件:
CFLAGS = -Wall -g -static
src = ex4.c
all: $(src)
cc -o ex4 $(src)
clean:
rm -f ex4
Run Code Online (Sandbox Code Playgroud)
Valgrind命令:
$valgrind --track-origins=yes ./ex4
Run Code Online (Sandbox Code Playgroud)
Valgrind输出:
==10268== Memcheck, a memory error detector
==10268== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et …Run Code Online (Sandbox Code Playgroud)