CRT内存泄露检测

来源:互联网 发布:最好的英汉词典软件 编辑:程序博客网 时间:2024/06/05 18:21

方法太多,工具的就不细说了,umdh,windbg都可以,说说代码的几个函数

调试的两个windows的头文件#include <crtdbg.h>#include<dbghelp.h>

1、内存状态比较

_CrtMemCheckpoint

_CrtMemCheckpoint

_CrtMemDifference

_CrtMemDumpAllObjectsSince

2、设置内存泄露报告

_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF);

之后根据报告的requestnum设置断点

_CrtSetBreakAlloc(146);

3、获取内存地址对应的requestNum

_CrtIsMemoryBlock(my_pointer, 10, &allocReqNum, NULL, NULL);

4、设置malloc,free的钩子函数

_CrtSetAllocHook();

free时参数requestnum是0,需要向上-1才能得到结构体再得到malloc时的requestnum

5、时刻检查内存边界是否被破坏

_CrtCheckMemory(),也可以让系统每次检查

_CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)



针对上面内存泄露检测的函数,对CRT中调试章节进行了一些查看,整理部分笔记如下:

7.1 _ASSERT
_ASSERTE:会打印出增加了表达式
_RPT0~RPT4:
_RPTF0~RPTF4:会打印文件及行信息
_CRT_WARN,_CRT_ERROR,_CRT_ASSERT
_CrtCheckMemory:确认调用堆中分配的内存块的完整性

7.2 _CrtSetReportMode:设置三个的报告模式,模式有
_CRTDBG_MODE_DEBUG:打印到vs的输出窗口
_CRTDBG_MODE_WNDW:打印到windows弹窗,提供“忽略”,“终止”,“重试”选项
_CRTDBG_MODE_FILE:打印到用户提供的文件句柄中
_CRTDBG_REPORT_MODE:获取当前的model

_CrtSetReportFile:设置文件句柄信息
_HFILE: 打开文件的句柄信息
_CRTDBG_FILE_STDERR:输出到stderr中
_CRTDBG_FILE_STDOUT:输出到stdout

_CrtSetReportHook: 设置报告函数挂钩
_CrtSetReportHook2: 设置报告函数挂钩扩展版本,可以挂钩多个函数,也可以接挂函数

_CrtDbgReport:生成调试信息报告

7.3 _CrtSetDbgFlag:设置标志位,返回上一个标志位
先熟悉一下有哪些内存块类型
#define _FREE_BLOCK      0
#define _NORMAL_BLOCK    1
#define _CRT_BLOCK       2
#define _IGNORE_BLOCK    3
#define _CLIENT_BLOCK    4

_CRTDBG_REPORT_FLAG:查询_CrtSetDbgFlag当前状态
_CRTDBG_ALLOC_MEM_DF:打开对调试分配模式,如果未启用,每块内存的类型都是_IGNORE_BLOCK了,也就无法调试内存信息了
_CRTDBG_CHECK_ALWAYS_DF:每次分配和重新分配时调用_CrtCheckMemory,每次new的时候检查,如果是上一个野指针越界访问了,也是在下一次别的操作new时才会发现,除非在越界访问后面手动调用_CrtCheckMemory
_CRTDBG_CHECK_CRT_DF:检查内存是否包括运行库(crt)使用的内存
_CRTDBG_DELAY_FREE_MEM_DF:内存链表中增加了释放的内存块,类型为_FREE_BLOCK
_CRTDBG_LEAK_CHECK_DF:在程序退出时通过_CrtDumpMemoryLeaks自动执行泄露检测

#define _CRTDBG_CHECK_EVERY_16_DF   0x00100000  /* check heap every 16 heap ops */ 设置后,会每次new16次后检测一次memory状态,当然,要把_CRTDBG_CHECK_ALWAYS_DF设置为false了
#define _CRTDBG_CHECK_EVERY_128_DF  0x00800000  /* check heap every 128 heap ops */
#define _CRTDBG_CHECK_EVERY_1024_DF 0x04000000  /* check heap every 1024 heap ops */


7.4 _CrtDumpMemoryLeaks
检查此时内存泄露信息,实际内部调用_CrtMemCheckpoint获取堆的当前状态,扫描没有释放的内存块转态,调用_CrtMemDumpAllObjectsSince打印出来


7.5_CrtIsValidHeapPointer
指定指针是否在本地堆中,如果有dll静态链接的crt,那么它的数据是在它自己的堆中的。

7.6 _CrtIsMemoryBlock
内存块是否在本地堆中,多了很多参数,返回该内存的requestnum,filename等信息

7.7、_CrtIsValidPointer
指定内存范围内读写是否有效

7.8 _CrtMemCheckpoint
保存当前内存块
_CrtMemDifference:比较内存块
_CrtMemDumpAllObjectsSince:转存内存块,展现出用户能够识别的信息,展现详情
_CrtMemDumpStatistics:转存内存块,展现基本信息

7.9 、_CrtSetAllocHook
设置内存钩子
_CrtSetBreakAlloc:根据requestnum设置断点



0 0