標籤: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 ); //一下請參考MSDNMINIDUMP_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 調試