码迷,mamicode.com
首页 > Windows程序 > 详细

windows Dump 调试

时间:2015-04-30 18:26:33      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:c++   dump   调试   

有时候程序的Release 版本发布出去后,在客户的机器上发送异常,大部分的情况下 我们都可以通过我们写的log 发现问题所在,但有时发送崩溃异常(如用到了野指针),我们希望能定位到发送崩溃的代码行。这时我们可以用dump文件。类似于Linux下的core文件。可以叫他“死前遗书”。


1,生成dump 文件。

windows 提供了dbghelp.dll 中的 MiniDumpWriteDump()。函数原型参考MSDN。

程序中先包含"dbghelp.h" "dbghelp.lib"

代码如下:


#include "windows.h"
#include "dbghelp.h"
//
LONG CallBackCrashHandler(EXCEPTION_POINTERS *pException)  
{   
	// 这里你可以做一个漂亮的界面或者其他
	//  
	MessageBox(NULL,L"哎呀妈,崩溃了",L"错误",MB_OK);

	//写dmp文件
	HANDLE hFile = CreateFile( _T("Dump.dmp"), GENERIC_READ | GENERIC_WRITE, 
		0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); 

	//一下请参考MSDN
	MINIDUMP_EXCEPTION_INFORMATION eInfo;
	eInfo.ThreadId = GetCurrentThreadId(); 
	eInfo.ExceptionPointers = pException;
	eInfo.ClientPointers = FALSE;

	MiniDumpWriteDump(
		GetCurrentProcess(),
		GetCurrentProcessId(),
		hFile,
		MiniDumpNormal,
		pException ? &eInfo : NULL,
		NULL,
		NULL);

	CloseHandle(hFile);

	return EXCEPTION_EXECUTE_HANDLER;  
}  

void Crash()   
{    
	int i = 13;  
	int j = 0;  
	int m = i / j;  
	printf("%d",m);
}  

int _tmain(int argc, _TCHAR* argv[])  
{  
	// 设置处理Unhandled Exception的回调函数  //程序发送异常调用
	SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CallBackCrashHandler);  

	Crash();

	return 0;  
}


2,分析dump 文件。

我用vs2010 分析步骤如下。

1,将客户机器上的Dump.dmp 弄过来。

2,将它和你本机 exe,pdb放在同一个目录。(Release 版本默认是不生成pdb文件的,可以通过“链接器”->“调试”->"生成调试信息"->"是"更改,所以你用svn管理版本的时候 要管理好)(主要exe pdb dmp 要是一致的)

3,用vs 打开Dump.dmp文件。


信息如下:


技术分享


可以知道异常原因。


4,点击右上角的“使用 使用 仅限本机 进行调试”


即可追查到代码的当前行数。







windows Dump 调试

标签:c++   dump   调试   

原文地址:http://blog.csdn.net/ren65432/article/details/45395953

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!