当前位置:Gxlcms > 数据库问题 > 【内存检测系列】window下windbg内存泄漏检查

【内存检测系列】window下windbg内存泄漏检查

时间:2021-07-01 10:21:17 帮助过:19人阅读

 

? 通过包括crtdbg.h,将malloc和free函数映射到它们的调试版本,即_malloc_dbg和 _free_dbg,这两个函数将跟踪内存分配和释放。 此映射在调试版本(在其中定义了_DEBUG)中发生。 发布版本使用普通的 malloc 和 free 函数。
? #define 语句将 CRT 堆函数的基版本映射到对应的“Debug”版本。 并非绝对需要该语句;但如果没有该语句,内存泄漏转储包含的有用信息将较少。
(2)、在添加了上述语句之后,可以通过在程序中包括以下语句(通常应恰好放在程序退出位置之前)来转储内存泄漏信息:

_CrtDumpMemoryLeaks();
  • 1

示例代码:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main(int argc,char** argv)
{
    char *str = (char*)malloc(20 * sizeof(char));
    _CrtDumpMemoryLeaks();
    return 0;
}

?当在调试器下运行程序时(按F5),_CrtDumpMemoryLeaks将在VS最下栏 “输出”窗口 -》显示输出来源-》调试 中显示内存泄漏信息。如果没有使用#Define _CRTDBG_MAP_ALLOC语句,输出窗口则不显示内存泄漏的具体位置。
注意:
? 如果程序总是在同一位置退出,调用 _CrtDumpMemoryLeaks 将非常容易。如果程序从多个位置退出,则无需在每个可能退出的位置放置对 _CrtDumpMemoryLeaks 的调用,而可以在程序开始处包含以下调用:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
?该语句在程序退出时自动调用 _CrtDumpMemoryLeaks。必须同时设置 _CRTDBG_ALLOC_MEM_DF 和 _CRTDBG_LEAK_CHECK_DF两个位域。
示例代码:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int main(int argc,char** argv)
{
    char *str = (char*)malloc(20 * sizeof(char));
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    return 0;
}

 

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>


void check_mem()
{
	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
}
 
int main(int argc,char** argv)
{
    char *str = (char*)malloc(20 * sizeof(char));
    atexit(check_mem);
    return 0;
}

 

注:上述方法在测试调用的第三方库是否存在内存泄漏时,并不能显示泄露函数在哪个文件、哪一行,只会简单的显示,如:

Detected memory leaks!  
Dumping objects ->  
{223} normal block at 0x003CF650, 4 bytes long.  
 Data: <  < > E8 F6 3C 00  

此时,需要在程序的入口处加入:

_CrtSetBreakAlloc(223);

在vs中按F5调试,在堆栈信息中就可以看到泄露的具体位置。其中223表示{223} normal block at 0x003CF650, 4 bytes long.

参考网址:https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
参考网址:https://www.cnblogs.com/skynet/archive/2011/02/20/1959162.html

from:https://blog.csdn.net/listener51/article/details/104417475?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control

【内存检测系列】window下windbg内存泄漏检查

标签:ring   pat   名句   asp   txt   注意   ges   开头   keyword   

人气教程排行