C/C++内存检测工具valgrind--memcheck

本文详细介绍了Valgrind的内存检测工具Memcheck,包括安装方法、Memcheck的检测范围,以及如何使用它检测并修复一个C++定时器程序中的内存问题。重点讲解了内存错误类型和解决案例,强调了代码审查中避免内存泄漏的重要性。

Valgrind简介

Valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,作者是获得过Google-O’Reilly开源大奖的Julian Seward,它包含一个内核 —— 一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务──调试,分析,或测试等,内存检测,我们可以使用它的工具:Memcheck。

 

Valgrind安装

方法 1. valgrind官网:http://valgrind.org下载

方法 2. Ubuntu: sudo apt-get install valgrind

 

Memcheck的检测范围

它可以用来检测c/c++程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc()/free()/new/delete的调用都会被捕获。所以,它能检测以下问题:
1). 对未初始化内存的使用;

2). 读/写释放后的内存块;

3). 读/写超出malloc等分配的动态内存范围;

4). 读/写不适当的栈中内存块;

5). 内存泄漏,指向一块内存的指针永远丢失;

6). 不正确的malloc/free或new/delete匹配;

7). memcpy()相关函数中的dst和src指针重叠问题。

 

Memcheck检测使用步骤及注意事项

1、在编译程序的时候打开调试模式(gcc编译器的-g选项),以便显示行号,编译时去掉-O1 -O2等优化选项;检查的是C++程序的时候,考虑加上选项: -fno- inline ,这样它函数调用链会很清晰。

2、执行:valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./YourProgram

3、程序运行结束,查看 log.txt 中的结果。

结果分析:

Valgrind(memcheck)包含这7类错误,黑体为一般的错误提示:

1、illegal read/illegal write errors 非法读取/非法写入错误

2、use of uninitialised values 使用未初始化的区域

3、use of uninitialised or unaddressable values in system calls 系统调用时使用了未初始化或不可寻址的地址

4、illegal frees 非法的释放

5、when a heap block is freed with an inappropriate deallocation function 分配和释放函数不匹配

6、overlapping source and destination blocks 源和目的内存块重叠

7、memory leak detection 内存泄漏检测

​ 7.1 Still reachable 内存指针还在还有机会使用或者释放,指针指向的动态内存还没有被释放就退出了

​ 7.2 Definitely lost 确定的内存泄露,已经不能够访问这块内存

​ 7.3 Indirectly lost 指向该内存的指针都位于内存泄露处

​ 7.4 Possibly lost 可能的内存泄露,仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首位置

​ 7.5 Suppressed 某些库产生的错误不予以提示,这些错误会被统计到suppressed项目

 

测试案例:

最近刚刚用最小堆实现了一个定时容器,写完之后就使用Valgrind的memcheck工具检测了一些内存,log日志如下:

==38716== Memcheck, a memory error detector
==38716== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==38716== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==38716== Command: ./test_heap_timer_new
==38716== Parent PID: 17817
==38716== 
==38716== Invalid write of size 4
==38716==    at 0x10BFF8: HeapTimer<Event>::setPos(int) (heap_timer.hpp:59)
==38716==    by 0x10BF30: HeapTimerContainer<Event>::percolateDown(int) (heap_timer.hpp:334)
==38716==    by 0x10BAD3: HeapTimerContainer<Event>::popTimer() (heap_timer.hpp:300)
==38716==    by 0x10B79C: HeapTimerContainer<Event>::tick() (heap_timer.hpp:196)
==38716==    by 0x10B34C: main (test_heap_timer_new.cpp:307)
==38716==  Address 0x4db2478 is 24 bytes inside a block of size 32 free'd
==38716==    at 0x483D1CF: operator delete(void*, unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==38716==    by 0x10BA8B: HeapTimerContainer<Event>::popTimer() (heap_timer.hpp:296)
==38716==    by 0x10B79C: HeapTimerContainer<Event>::tick() (heap_timer.hpp:196)
==38716==    by 0x10B34C: main (test_heap_timer_new.cpp:307)
==38716==  Block was alloc'd at
==38716==    at 0x483BE63: operator new(unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值