C 除錯之建立Dump檔案和除錯Dump檔案

2021-08-26 05:16:22 字數 1778 閱讀 9094

如何在發布後程式中捕獲程式的崩潰和異常往往是比較麻煩的事情,一般採用日誌記錄的方法來記錄程式執行的每個流程,但是通常為了程式執行的效能,日誌記錄的方法只是記錄程式執行的每個主要的處理流程,不能進行具體詳細的記錄,比如for 迴圈中的崩潰記錄。c++語言中呼叫window api函式createfile()和minidumpwritedump(),可以方便的記錄程式崩潰時的dump資訊,並保持dump檔案,根據dump檔案對應的原始碼工程和.pdb檔案,我們就可以快速的定位到程式崩潰的原始碼位置,極大的提高了除錯**的效率。然而,dump記錄程式崩潰的方法不是萬能的,有時候一些陣列越界、容器訪問異常等致命的問題,也不一定能準確的記錄下來。總之,dump檔案記錄程式崩潰的方法是開放人員常用的方法,並且能捕獲大多數的程式崩潰問題。

下面是一段記錄程式崩潰時生成dump檔案的方法,只要在工程中包含這個標頭檔案**,然後在程式建構函式中宣告    runcrashhandler(); 即可在程式崩潰時記錄生成的dump檔案:

#ifndef  dumpfile_h

#define dumpfile_h

#include #include #include #include using namespace std;

#pragma comment(lib, "dbghelp.lib")

namespace nsdumpfile

lptop_level_exception_filter winapi mydummysetunhandledexceptionfilter(lptop_level_exception_filter lptoplevelexceptionfilter)

bool preventsetunhandledexceptionfilter()

long winapi unhandledexceptionfilterex(struct _exception_pointers *pexception)

; //::getmodulefilename(null, szmbsfile, max_path);

//tchar* pfind = _tcsrchr(szmbsfile, '\\');

//if (pfind)

////建立 dmp 資料夾

char *_path = "dumps";

int retval = _mkdir(_path);

tchar szfilename[max_path] = ;

tchar* szversion = _t("reg");

systemtime stlocaltime;

getlocaltime(&stlocaltime);

wsprintf(szfilename, l"dumps/%s_%04d%02d%02d-%02d%02d%02d.dmp",

szversion, stlocaltime.wyear, stlocaltime.wmonth, stlocaltime.wday,

stlocaltime.whour, stlocaltime.wminute, stlocaltime.wsecond);

createdumpfile(szfilename, pexception);

// todo: minidumpwritedump

return exception_continue_search;

} void runcrashhandler() };

#define declaredumpfile() nsdumpfile::runcrashhandler();

#endif //dumpfile_h

C 生成dump檔案,除錯dump檔案

dump 檔案是程序的記憶體映象 可以把程式的執行狀態通過偵錯程式儲存到dump檔案中 dump 檔案是用來給驅動程式編寫人員除錯驅動程式用的 這種檔案必須用專用工具軟體開啟 比如使用 windbg visualstudio開啟 當我們的程式發布出去之後 在客戶機上是無法跟蹤自己 的 bug 的 所...

DUMP檔案除錯

一 vc6.0下 1 首先要生成 pdb和 map檔案,需要做以下設定 勾選紅色的地方 按上面截圖的設定好後編譯即可。二 dmp檔案生成 1 dmp 檔案的生成,這個需要依賴一些 來生成這個檔案,這裡就不貼 了。程式測試下這個函式。上面 讓他人為崩潰,執行完後崩潰,會生成dmp檔案。三 windbg...

如何除錯崩潰dump檔案

其實除錯dump檔案很簡單,雙擊自動開啟vc然後f7執行。但是中間要注意很多事情。1。dump檔案放在 dump檔案不用非要放在你編譯出來的位置,你完全可以建立乙個新的資料夾來放它。2。要恢復當時的現場 可能你要問,怎麼可能,這個dump檔案可是使用者發給我的,我不可能去使用者家裡除錯吧?這個恢復現...