標籤:div current clu rate filter %s form back 出現
Dump 檔案是進程的記憶體鏡像 , 可以把程式的執行狀態通過調試器儲存到dump檔案中 ; Dump 檔案是用來給驅動程式編寫人員調試驅動程式用的 , 這種檔案必須用專用工具軟體開啟 , 比如使用 WinDbg , VisualStudio 開啟 ;
當我們的程式發布出去之後 , 在客戶機上是無法跟蹤自己代碼的 BUG 的 , 所以 Dump 檔案對於我們來說特別有用 ; 我們可以通過 .dmp 檔案把出現 BUG 的情況再現 , 然後再現客戶環境 (包括堆棧調用等情況) , 設定源碼調試路徑 , 可以找到出現 BUG 的語句 ;
C++ 程式設定產生 Dump 檔案的代碼如下 :
#include "stdafx.h"#include "Windows.h"#include "DbgHelp.h"int GenerateMiniDump(PEXCEPTION_POINTERS pExceptionPointers){ // 定義函數指標 typedef BOOL(WINAPI * MiniDumpWriteDumpT)( HANDLE, DWORD, HANDLE, MINIDUMP_TYPE, PMINIDUMP_EXCEPTION_INFORMATION, PMINIDUMP_USER_STREAM_INFORMATION, PMINIDUMP_CALLBACK_INFORMATION ); // 從 "DbgHelp.dll" 庫中擷取 "MiniDumpWriteDump" 函數 MiniDumpWriteDumpT pfnMiniDumpWriteDump = NULL; HMODULE hDbgHelp = LoadLibrary(_T("DbgHelp.dll")); if (NULL == hDbgHelp) { return EXCEPTION_CONTINUE_EXECUTION; } pfnMiniDumpWriteDump = (MiniDumpWriteDumpT)GetProcAddress(hDbgHelp, "MiniDumpWriteDump"); if (NULL == pfnMiniDumpWriteDump) { FreeLibrary(hDbgHelp); return EXCEPTION_CONTINUE_EXECUTION; } // 建立 dmp 檔案件 TCHAR szFileName[MAX_PATH] = {0}; TCHAR* szVersion = _T("DumpDemo_v1.0"); SYSTEMTIME stLocalTime; GetLocalTime(&stLocalTime); wsprintf(szFileName, L"%s-%04d%02d%02d-%02d%02d%02d.dmp", szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond); HANDLE hDumpFile = CreateFile(szFileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); if (INVALID_HANDLE_VALUE == hDumpFile) { FreeLibrary(hDbgHelp); return EXCEPTION_CONTINUE_EXECUTION; } // 寫入 dmp 檔案 MINIDUMP_EXCEPTION_INFORMATION expParam; expParam.ThreadId = GetCurrentThreadId(); expParam.ExceptionPointers = pExceptionPointers; expParam.ClientPointers = FALSE; pfnMiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, (pExceptionPointers ? &expParam : NULL), NULL, NULL); // 釋放檔案 CloseHandle(hDumpFile); FreeLibrary(hDbgHelp); return EXCEPTION_EXECUTE_HANDLER;}LONG WINAPI ExceptionFilter(LPEXCEPTION_POINTERS lpExceptionInfo){ // 這裡做一些異常的過濾或提示 if (IsDebuggerPresent()) { return EXCEPTION_CONTINUE_SEARCH; } return GenerateMiniDump(lpExceptionInfo);}int main(){ // 加入崩潰dump檔案功能 SetUnhandledExceptionFilter(ExceptionFilter); // 使程式崩潰產生 Dump 檔案 int *p = NULL; *p=1;}
然後編譯項目 , 運行程式 , 就會發現在當前運行目錄產生了 Dump 檔案 , 類似 DumpDemo_v1.0-20170602-154446.dmp ;
產生 Dump 檔案後 , 我們可以用 VS2012 等工具來進行調試,傳送門。
如何設定C++崩潰時產生Dump檔案