`

memory leak

阅读更多

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>

#include <crtdbg.h>

下面的语句放在主函数开头,就不用每个出口都写上_CrtDumpMemoryLeaks(); 了

#ifdef _DEBUG
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF| _CRTDBG_LEAK_CHECK_DF);
#endif

 

how to:dbghelp, dr.watson

如何捕捉程序异常

使用dbghelp获取调用堆栈

 

#include <windows.h>
#include <stdio.h>
#include <dbghelp.h>

#pragma comment( lib, "dbghelp.lib" )

void dump_callstack( CONTEXT *context )
{
	STACKFRAME sf;
	memset( &sf, 0, sizeof( STACKFRAME ) );

	sf.AddrPC.Offset = context->Eip;
	sf.AddrPC.Mode = AddrModeFlat;
	sf.AddrStack.Offset = context->Esp;
	sf.AddrStack.Mode = AddrModeFlat;
	sf.AddrFrame.Offset = context->Ebp;
	sf.AddrFrame.Mode = AddrModeFlat;

	DWORD machineType = IMAGE_FILE_MACHINE_I386;

	HANDLE hProcess = GetCurrentProcess();
	HANDLE hThread = GetCurrentThread();

	for( ; ; )
	{
		if( !StackWalk(machineType, hProcess, hThread, &sf, context, 0, SymFunctionTableAccess, SymGetModuleBase, 0 ) )
		{
			break;
		}

		if( sf.AddrFrame.Offset == 0 )
		{
			break;
		}
		BYTE symbolBuffer[ sizeof( SYMBOL_INFO ) + 1024 ];
		PSYMBOL_INFO pSymbol = ( PSYMBOL_INFO ) symbolBuffer;

		pSymbol->SizeOfStruct = sizeof( symbolBuffer );
		pSymbol->MaxNameLen = 1024;

		DWORD64 symDisplacement = 0;
		if( SymFromAddr( hProcess, sf.AddrPC.Offset, 0, pSymbol ) )
		{
			printf( "Function : %s\n", pSymbol->Name );
		}
		else
		{
			printf( "SymFromAdd failed!\n" );
		}

		IMAGEHLP_LINE lineInfo = { sizeof(IMAGEHLP_LINE) };
		DWORD dwLineDisplacement;

		if( SymGetLineFromAddr( hProcess, sf.AddrPC.Offset, &dwLineDisplacement, &lineInfo ) )
		{
			printf( "[Source File : %s]\n", lineInfo.FileName ); 
			printf( "[Source Line : %u]\n", lineInfo.LineNumber ); 
		}
		else
		{
			printf( "SymGetLineFromAddr failed!\n" );
		}
	}
}

DWORD excep_filter( LPEXCEPTION_POINTERS lpEP )
{
	/**//// init dbghelp.dll
	if( SymInitialize( GetCurrentProcess(), NULL, TRUE ) )
	{
		printf( "Init dbghelp ok.\n" );
	}

	dump_callstack( lpEP->ContextRecord );

	if( SymCleanup( GetCurrentProcess() ) )
	{
		printf( "Cleanup dbghelp ok.\n" );
	}

	return EXCEPTION_EXECUTE_HANDLER;
}

void func1( int i )
{
	int *p = 0;
	*p = i;
}

void func2( int i )
{
	func1( i - 1 );
}

void func3( int i )
{
	func2( i - 1 );
}

void test( int i )
{
	func3( i - 1 );
}

int main()
{
	__try
	{
		test( 10 );
	}
	__except( excep_filter( GetExceptionInformation() ) )
	{
		printf( "Some exception occures.\n" );
	}

	return 0;
}

 执行结果

Init dbghelp ok.
Function : func1
[Source File : g:\tmp\test_mem_leak\test_getexceptioninformation\test.cpp]
[Source Line : 87]
Function : func2
[Source File : g:\tmp\test_mem_leak\test_getexceptioninformation\test.cpp]
[Source Line : 92]
Function : func3
[Source File : g:\tmp\test_mem_leak\test_getexceptioninformation\test.cpp]
[Source Line : 97]
Function : test
[Source File : g:\tmp\test_mem_leak\test_getexceptioninformation\test.cpp]
[Source Line : 102]
Function : main
[Source File : g:\tmp\test_mem_leak\test_getexceptioninformation\test.cpp]
[Source Line : 109]
Function : __tmainCRTStartup
[Source File : f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c]
[Source Line : 582]
Function : mainCRTStartup
[Source File : f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c]
[Source Line : 399]
Function : RegisterWaitForInputIdle
SymGetLineFromAddr failed!
Cleanup dbghelp ok.
Some exception occures.

分享到:
评论

相关推荐

    BREW Memory Leak Checker 20120219

    This program is a tool that help you positioning memory leak locations of an QUALCOMM BREW application on simulator. It can give the call stack of memory leaks (including the locations that MALLOC/...

    BREW Memory Leak Checker

    **BREW Memory Leak Checker** 是一个专为BREW(Binary Runtime Environment for Wireless)平台设计的工具,用于检测和定位BREW应用程序中的内存泄漏问题。在移动设备开发中,内存管理是至关重要的,因为有限的资源...

    BREW Memory Leak Checker 20111030

    BREW Memory Leak Checker是一款专为BREW(Binary Runtime Environment for Wireless)平台设计的内存泄漏检测工具,版本号为20111030。该工具的主要功能是在BREW模拟器上帮助开发者定位并解决应用程序中的内存泄漏...

    BREW Memory Leak Checker 20111109

    BREW Memory Leak Checker是一款专为BREW(Binary Runtime Environment for Wireless)平台设计的内存泄漏检测工具,版本号为20111109。该工具的主要功能是在BREW模拟器上帮助开发者定位并解决应用程序中的内存泄漏...

    技術分享_Glassfish 3.1.2.2 Web Service Memory Leak Workaround1

    Glassfish 3.1.2.2 Web Service Memory Leak Workaround Glassfish 3.1.2.2 中的 Memory Leak 问题可能会导致服务器变慢或无响应。这种问题可能是由于 Web Service 的 Memory Leak 导致的。在此文中,我们将讨论...

    C++ Memory Leak Detect

    本文将深入探讨C++中的内存泄漏问题及其解决策略,并介绍两种常用的内存泄漏检测工具——Visual Leak Detector (VLD) 和 CodeSnitch。 内存泄漏的发生通常是由于以下原因: 1. 动态分配的内存未被释放:当使用`new`...

    BREW Memory Leak Checker 20120219 (with src)

    This program is a tool that help you positioning memory leak locations of an QUALCOMM BREW application on simulator. It can give the call stack of memory leaks (including the locations that MALLOC/...

    Memory Leak.zip

    JavaScript是一种广泛应用于Web开发的脚本语言,它在执行时占据内存资源,如果代码编写不当,可能会出现“内存泄漏”(Memory Leak)的问题。内存泄漏是程序运行时未释放不再使用的内存,导致系统资源浪费,严重时...

    有关flex 内存泄漏memory leak介绍的ppt

    首先,我们来了解一下什么是内存泄漏(Memory Leak)。内存泄漏是指程序在申请内存后,无法释放已不再使用的内存空间,一次小的内存泄漏可能看似无足轻重,但随着时间推移,大量累积的内存泄漏会消耗掉系统资源,...

    memory leak & double free如何排查?

    在IT行业中,内存泄露(Memory Leak)和双重释放(Double Free)问题会严重威胁程序的稳定性和性能。本文旨在介绍如何通过自主构建工具的方式,排查内存泄露和双重释放问题,而不是依赖现有的内存排查工具。本文将...

    Android中Memory Leak原因分析及解决办法

    "Android中Memory Leak原因分析及解决办法" Android中Memory Leak原因分析及解决办法是Android开发过程中的重要问题之一。Memory Leak是指在Android应用程序中,一些对象不能被正确释放,导致这些对象继续占用内存...

    Memory leak

    - [Wikipedia - Memory leak](https://en.wikipedia.org/wiki/Memory_leak) - [Microsoft Docs - Detect and fix memory leaks]...

    Memory Leak(解决方案).md

    Memory Leak(解决方案).md

    Memory_and_Exception_Trace.zip_memory leak_trace

    "Memory leak trace"指的是追踪和定位内存泄漏的过程,这对于优化和维护代码至关重要。 1. **内存管理基础**:在C++中,程序员负责手动管理内存。`new`和`delete`关键字用于动态分配和释放内存。动态分配的内存应在...

    Visual C ++ memory Leak Detector.rar

    "Visual C++ Memory Leak Detector"就是针对这类问题的工具,它可以帮助开发者检测和定位C++程序中的内存泄漏。 该压缩包文件包含了一个名为"vld-1.9d-setup.exe"的安装程序,这很可能是Visual Leak Detector (VLD)...

    Memory Leak Detected(亲测可用).md

    Memory Leak Detected(亲测可用).md

    编译器设计之代码分析工具:Memory Leak Detectors.zip

    编译器设计之代码分析工具:Memory Leak Detectors

    c++ memory leak 检测代码

    在C++编程中,内存泄漏是一个常见的问题,它发生在程序员分配了内存但未能正确地释放。这可能导致程序占用越来越多的内存,最终导致性能下降甚至崩溃。为了帮助开发者检测和修复内存泄漏,本压缩包提供了一个内存...

Global site tag (gtag.js) - Google Analytics