如何設定C++崩潰時產生Dump檔案

來源:互聯網
上載者:User

標籤: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檔案

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.