DMP文件的生成和使用


1、生成dmp的程序

#include  <dbghelp.h> 
#pragma comment(lib,  "dbghelp.lib")


//設置異常處理回調函數
SetUnhandledExceptionFilter(UnhandledExceptionFilter);


//異常處理代碼
//EXCEPTION_EXECUTE_HANDLER equ 1 表示我已經處理了異常,可以優雅地結束了 
//EXCEPTION_CONTINUE_SEARCH equ 0 表示我不處理,其他人來吧,於是windows調用默認的處理程序顯示一個錯誤框,並結束 
//EXCEPTION_CONTINUE_EXECUTION equ -1 表示錯誤已經被修復,請從異常發生處繼續執行 
LONG UnhandledExceptionFilter(struct _EXCEPTION_POINTERS* ExceptionInfo)
{
    CString   strDumpFile; 
    strDumpFile.Format("%d",CTime::GetCurrentTime().GetTickCount());
    strDumpFile   +=  ".dmp "
    HANDLE   hFile   =   CreateFile(strDumpFile,   GENERIC_WRITE,   FILE_SHARE_WRITE,   NULL,   CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,   NULL   );

    if   (hFile!=INVALID_HANDLE_VALUE)
    { 
        MINIDUMP_EXCEPTION_INFORMATION   ExInfo; 

        ExInfo.ThreadId   =   ::GetCurrentThreadId();
        ExInfo.ExceptionPointers   =   ExceptionInfo;
        ExInfo.ClientPointers   =   NULL;

        //   write   the   dump
        BOOL   bOK   =   MiniDumpWriteDump(GetCurrentProcess(),   GetCurrentProcessId(),   hFile,   MiniDumpNormal,  &ExInfo,   NULL,   NULL   );
        CloseHandle(hFile); 
    } 

    theApp.PostThreadMessage(WM_QUIT,0,0);
    return EXCEPTION_EXECUTE_HANDLER;
}

2、調試dump文件

    1)用windbg。

    2)用vc,把dmp文件和exe, pdb文件放在同一目錄下, 然后用編譯器(如vc)打開, 然后開始調試就會中斷到剛才中斷的地方.


3、以下是網上搜集到的條件,尚未驗證是否是必需的,如果不能正確的生成dmp,可嘗試以下方法

    1)SetUnhandledExceptionFilter()並不能處理所有的異常,比如CRT異常需要調用_set_invalid_parameter_handler()才行

    1)要設置c運行庫異常處理函授。這樣當出錯后,會引發你的異常處理,你的處理中,可以直接丟掉或重新啟動你的exe,或寫入log文件。

    2)注意生成的release應用程序需要開啟“生成調試信息”選項。

    2)使用VS2008的話,不需要開啟“生成調試信息”選項就可以生成的。

    3)編譯release版本的時候同時生成map文件,具體可以在網上查找一下關於map文件的使用方法。

    3)生成可執行文件時在工程屬性設置里的“調試”選項里將“生成映射文件”設置為“是”。這主要是用來在出錯時通過dump和map文件對錯誤定位。

4、其他工具

    1)生成dump文件需要Dr.Watson,它是Windows自帶的調試工具,只要對它進行了設置,程序出錯后就可以在相應目錄下找到dump文件。可參見如下資料:http://hi.baidu.com/mryongzhang/blog/item/11a774edf9b513d72e2e2167.html

    2)adplus是最有用的工具,http://support.microsoft.com/kb/286350/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM