有时候程序的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,点击右上角的“使用 使用 仅限本机 进行调试”
即可追查到代码的当前行数。
原文地址:http://blog.csdn.net/ren65432/article/details/45395953