一、前言前不久開發(fā)了一款windows程序,目前已經(jīng)是測試跑了,對于windows程序熟悉的童鞋,應(yīng)該都知道一個事,就是他運行時有一個黑框,如果崩潰的就是下面這種情形~
這種情況有時候會給我們一種不知所措的感覺,看日志吧~有時候崩潰了,不一定出現(xiàn)在什么地方;異常處理吧,又不像JAVA那么多的異常,所以很多時候,我們遇到這種情況就有些不知所措了~今天,帶來一款終極秘密武器---dump文件;
二、實戰(zhàn) 1、dump文件簡介dump文件是進程的內(nèi)存鏡像,可以吧程序的執(zhí)行狀態(tài)通過調(diào)試器保存到dump文件中;
2、通過任務(wù)管理生成dump文件首先,我們寫一段測試程序:
#include ? using ?namespace ?std ;void ?fun (int *?p) { ?p[0 ]?=?1 ; }int ?main () { ?fun(NULL ); ?return ?0 ; }然后我們編譯一把,再運行我們會得到這么一個錯誤:
此時,我們不要做關(guān)閉這個框,我們只需要吧任務(wù)管理器打開,找到該進程,然后導(dǎo)出文件就可以了
我們打開路徑,拷貝該文件到我們exe所在的目錄:
然后我們打開vs,這里使用的是
vs2015由于我吧
dmp文件放在了
exe和
dpb目錄下,不用設(shè)置符號路徑
這里
千萬注意一點 ,很多博客上都沒有說到這一點:
32位程序和64位程序調(diào)試是不同的 如果我們程序是32位的,但是我們的開發(fā)機是64位,通過轉(zhuǎn)存儲文件生成的文件就不是我們32位程序?qū)?yīng)的文件了,就會無法
調(diào)試 ;
3、通過程序生成dump文件上面我們說到了通過任務(wù)管理器生成的dump文件的方式會出現(xiàn)不兼容或者說是錯誤,那么怎么去解決這個問題呢?還好微軟也提供了
API出來,我們可以再程序中使用微軟的
API進行調(diào)用,這樣通過程序產(chǎn)生的dump文件就沒有位數(shù)的問題了;這里提供一個通用的代碼,是直接可以拿過來用的~感覺我吧
minidmp.h#pragma ?once #include ? #include ? #include ? #pragma ?comment(lib,?"dbghelp.lib" ) #pragma ?warning (disable:4996)?//全部關(guān)掉 #pragma ?warning (once:4996)?//僅顯示一個 /* #ifndef?_M_IX86 #error?"The?followin g?code?only?works?for?x86!" #endif */ inline ?BOOL?IsDataSectionNeeded (const ?WCHAR*?pModuleName) { ?if ?(pModuleName?==?0 ) ?{ ??return ?FALSE; ?} ?WCHAR?szFileName[_MAX_FNAME]?=?L"" ; ?_wsplitpath(pModuleName,?NULL ,?NULL ,?szFileName,?NULL ); ?if ?(wcsicmp(szFileName,?L"ntdll" )?==?0 ) ??return ?TRUE; ?return ?FALSE; }inline ?BOOL?CALLBACK?MiniDumpCallback (PVOID????????????????????????????pParam, ?const ?PMINIDUMP_CALLBACK_INPUT???pInput, ?PMINIDUMP_CALLBACK_OUTPUT????????pOutput) { ?if ?(pInput?==?0 ?||?pOutput?==?0 ) ??return ?FALSE; ?switch ?(pInput->CallbackType) ?{ ?case ?ModuleCallback: ??if ?(pOutput->ModuleWriteFlags?