Valgrind可以模拟cpu执行你的程序,然后给出内存使用或者程序错误信息。之前只使用过gdb来调试程序逻辑错误,现在准备多看几个,包括性能方面的调试。
安装直接使用的apt源安装的,使用也比较简单。直接valgrind ./a.out允许程序,运行过程中会给出程序建议。
这个程序我有一个一百万长度的uint64的数组,提示了"Invalid write of size 8"的错误,Warning: client switching stacks? SP change: 0x6c55ef0 --> 0x64b4c60 to suppress, use: --max-stackframe=8000144 or greater
我搜了一下发现说是栈空间消耗太大,我改成calloc,两个错误提示都没了。
==15130== HEAP SUMMARY:
==15130== in use at exit: 457,122,934 bytes in 4,659,095 blocks
==15130== total heap usage: 4,659,118 allocs, 23 frees, 457,166,878 bytes allocated
==15130==
==15130== LEAK SUMMARY:
==15130== definitely lost: 48,850,904 bytes in 177,241 blocks
==15130== indirectly lost: 400,271,992 bytes in 4,481,851 blocks
==15130== possibly lost: 8,000,000 bytes in 1 blocks
==15130== still reachable: 38 bytes in 2 blocks
==15130== suppressed: 0 bytes in 0 blocks
==15130== Rerun with --leak-check=full to see details of leaked memory
最后有内存统计信息,malloc后没有free的内存都会在统计。下面这段解释是我摘自网上的,我感觉不太准确(可能是valgrind检测的就不太准确),但是个参考。
Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。
Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。在上述的例子中,根节点是directly lost,而其他节点是indirectly lost。
possibly lost: 8,000,000 bytes in 1 blocks这个就是我那个一百万的数组malloc后没有free释放的,然后我free后,这行就没了。但我指针没修改,是个多线程的内存申请,但是只检测出一个来。四个线程没一个都malloc了。
Valgrind User Manual写的很详细,好多功能,一时半会也试不完。先体验一把,有需求再说。
上一篇: 系统大端序和小端序的转换
下一篇: C语言差错调试工具1-Callgrind,cachegrind
0 Responses so far.