Valgrind

与内存有关的问题可以分成两类:内存访问错误和内存使用错误。内存访问错误包括错误地读取内存和错误地写内存。错误地读取内存可能让你的模块返回意想不到的结果,从而导致后续的模块运行异常。错误地写内存可能导致系统崩溃。内存使用方面的错误主要是指申请的内存没有正确释放,从而使程序运行逐渐减慢,直至停止。

首先必须搞懂什么是内存泄漏,其实,业界一直有两种定义:

a. 大众化说法:一块内存由new或者malloc分配了,在程序结束前一直没有被回收。但程序始终有指针指向这块内存。

b. 更严格的说法:一块内存由new或者malloc分配在堆上面,在程序结束前,已经没有任何指针能够指向这块内存了。

对于第一种Memory Leak,其实危害不大,因为一旦进程结束了,所有该进程分配的内存(包括Leak掉的内存)都会被kernel回收。

对于第二种Memory Leak,大家一致认为对大型服务器端运行的程序是有危害的。如果程序一直在执行,Leak的内存会越来越多,可能会耗尽程序的堆内存。

相应的,在Valgrind里面,称第一种Leak“still reachable”,称第二种为“memory leak”。对于memory leak又分为两种。Directly lostIndirectly lost

Memcheck 工具主要检查下面的程序错误:

l   使用未初始化的内存 (Use of uninitialised memory)    

l   使用已经释放了的内存 (Reading/writing memory after it has been free’d)    

l   使用超过 malloc分配的内存空间(Reading/writing off the end of malloc’d blocks)    

l   对堆栈的非法访问 (Reading/writing inappropriate areas on the stack)    

l   申请的空间是否有释放 (Memory leaks – where pointers to malloc’d blocks are lost forever)    

l   malloc/free/new/delete申请和释放内存的匹配(Mismatched use of malloc/new/new [] vs free/delete/delete [])    

l   srcdst的重叠(Overlapping src and dst pointers in memcpy() and related functions)    

 

#include <</span>string.h>

void **rrr;

int main(void)

{

    rrr = malloc(sizeof(void *));

    *rrr = strdup("bbb");

    rrr = NULL;

    return 0;

}

Valgrind检查上面的代码:

$ valgrind --leak-check=full --show-reachable=yes ./a.out

==16420== 4 bytes in 1 blocks are indirectly lost in loss record 1 of 2

==16420== at 0x4A05E1C: malloc (vg_replace_malloc.c:195)

==16420== by 0x374EA79771: strdup (in /lib64/libc-2.5.so)

==16420== by 0x4005E2: main (in /home/zzhan17/test/a.out)

==16420==

==16420== 12 (8 direct, 4 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 2

==16420== at 0x4A05E1C: malloc (vg_replace_malloc.c:195)

==16420== by 0x4005CA: main (in /home/zzhan17/test/a.out)

==16420==

==16420== LEAK SUMMARY:

==16420== definitely lost: 8 bytes in 1 blocks

==16420== indirectly lost: 4 bytes in 1 blocks

==16420== possibly lost: 0 bytes in 0 blocks

==16420== still reachable: 0 bytes in 0 blocks

==16420== suppressed: 0 bytes in 0 blocks

如果把上面的“rrr = NULL; ”代码删除, Valgrind不会报告任何memory leak但会显示有memory still reachable,原因是void **rrrglobal pointer,程序退出时rrr还能指向AAABBB

### Valgrind工具介绍 Valgrind是一套Linux下的开源(GPL V2)仿真调试工具集[^4]。这套工具不仅限于单一的功能,而是提供了多种不同的工具用于解决不同类型的编程问题。 #### 功能概述 除了最为人熟知的内存错误检测工具Memcheck之外,Valgrind还包括了Cachegrind、Helgrind、Callgrind和Massif等多个实用工具[^1]。这些工具各自专注于不同的方面: - **Memcheck**: 主要用来查找程序中的内存管理错误,如访问未初始化或已释放的内存区域等。 - **Cachegrind**: 可以帮助开发者理解其应用程序如何与CPU缓存交互,从而优化性能[^3]。 - **Helgrind**: 专门针对多线程应用中存在的竞态条件等问题进行诊断。 - **Callgrind**: 类似于Cachegrind,但是更侧重于函数调用关系及其成本分析。 - **Massif**: 提供详细的堆栈分配历史记录,有助于识别大对象创建的位置并减少不必要的动态内存占用。 #### 安装过程 对于希望安装最新版本Valgrind的用户来说,可以按照下面的方式操作[^2]: ```bash mkdir valgrind-inst && cd valgrind-inst/ wget http://www.valgrind.org/downloads/valgrind-latest.tar.bz2 tar -xf valgrind-latest.tar.bz2 cd valgrind-*/ ./configure make sudo make install ``` 请注意上述命令适用于大多数类Unix操作系统,具体路径可能因下载时间的不同而有所变化。 #### 使用实例 当想要使用除默认Memcheck以外的其他工具时,可以通过`--tool=`参数来指定所需的工具名称。例如,如果想通过Cachegrind来进行缓存行为分析,则应执行如下命令: ```bash valgrind --tool=cachegrind ./your_program ``` 这里假设`your_program`是你编译后的可执行文件名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值