有时候程序的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