锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 2銆佹妸浼樺寲disable錛屽惁鍒欏鏄撲駭鐢熶唬鐮佸湴鍧鍋忕Щ錛?/p> 3銆佺敤program database浜х敓PDB鏂囦歡錛?/p> 4銆佸皢dll, exe, pdb錛屽姞涓婄増鏈彿錛岄槻姝笅嬈″紑鍙戠紪璇戞椂鎶婅佺殑PDB鍐叉帀銆?/p> 5銆佸彂甯冪殑鐗堟湰錛岃緭鍑哄埌涓涓浐瀹氱洰褰曪紝闃叉浜轟負(fù)鍒犻櫎Debug錛?Relase瀵艱嚧涓㈠け 6銆佸浜庡凡緇忕ǔ瀹氱殑鐗堟湰dll, exe錛岀紪璇戞椂錛屽彲灝嗕紭鍖栧紑鍚傦紙铏界劧鍋剁劧鏈変唬鐮佸湴鍧鍋忕Щ錛屼絾鏄繕鍙互鎺ュ彈錛?/p> 7銆佺敓鎴怣iniDump鏃訛紝鐢∕iniDumpWithDataSegs鏂瑰紡錛岃繖鏍鳳紝鍏ㄥ眬鍙橀噺鐨勫間篃鍙煡鐪?/p> 榪欎釜鏂規(guī)闇瑕佽嚜宸卞姩鎵嬪線宸ョ▼閲屾坊鍔犱唬鐮佷簡銆傝瀹炵幇涓婇潰鐨勬兂娉曪紝闇瑕佸仛涓や歡浜嬫儏錛?span lang="EN-US">1銆侀渶瑕佸湪crash鏃舵湁鏈轟細(xì)瀵圭▼搴忓爢鏍堣繘琛屽鐞嗭紱2銆佸鍫嗘爤淇℃伅榪涜鏀墮泦銆?span lang="EN-US">
1銆?span lang="EN-US">SetUnhandleExceptionFilter鍑芥暟
Windows騫沖彴涓嬬殑C++紼嬪簭寮傚父閫氬父鍙垎涓轟袱縐嶏細(xì)緇撴瀯鍖栧紓甯革紙Structured Exception錛屽彲浠ョ悊瑙d負(fù)涓庢搷浣滅郴緇熺浉鍏崇殑寮傚父錛夊拰C++寮傚父銆傚浜庣粨鏋勫寲寮傚父澶勭悊錛?span lang="EN-US">SEH錛夛紝鍙互鎵懼埌寰堝璧勬枡錛屽湪姝や笉緇嗚銆傚浜?span lang="EN-US">crash閿欒錛屼竴鑸敱鏈姝e父鎹曡幏鐨勫紓甯稿紩璧鳳紝Windows鎿嶄綔緋葷粺鎻愪緵浜嗕竴涓?span lang="EN-US">API鍑芥暟鍙互鍦ㄧ▼搴?span lang="EN-US">crash涔嬪墠鏈夋満浼?xì)澶勭悊杩欎簺寮傚父锛尀鏄?span lang="EN-US">SetUnhandleExceptionFilter鍑芥暟銆傦紙C++涔熸湁涓涓被浼煎嚱鏁?span lang="EN-US">set_terminate鍙互澶勭悊鏈鎹曡幏鐨?span lang="EN-US">C++寮傚父銆傦級
SetUnhandleExceptionFilter鍑芥暟澹版槑濡備笅錛?span lang="EN-US">
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI SetUnhandledExceptionFilter( __in LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter ); 鍏朵腑 LPTOP_LEVEL_EXCEPTION_FILTER 瀹氫箟濡備笅錛?span lang="EN-US">
typedef LONG (WINAPI *PTOP_LEVEL_EXCEPTION_FILTER)(
__in struct _EXCEPTION_POINTERS *ExceptionInfo
); typedef PTOP_LEVEL_EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER;
綆鍗曟潵璇達(dá)紝SetUnhandleExceptionFilter鍏佽鎴戜滑璁劇疆涓涓嚜宸辯殑鍑芥暟浣滀負(fù)鍏ㄥ眬SEH榪囨護鍑芥暟錛屽綋紼嬪簭crash鍓嶄細(xì)璋冪敤鎴戜滑鐨勫嚱鏁拌繘琛屽鐞嗐傛垜浠彲浠ュ埄鐢ㄧ殑鏄?_EXCEPTION_POINTERS 緇撴瀯綾誨瀷鐨勫彉閲?span lang="EN-US">ExceptionInfo錛屽畠鍖呭惈浜嗗寮傚父鐨勬弿榪頒互鍙婂彂鐢熷紓甯哥殑綰跨▼鐘舵侊紝榪囨護鍑芥暟鍙互閫氳繃榪斿洖涓嶅悓鐨勫兼潵璁╃郴緇熺戶緇繍琛屾垨閫鍑哄簲鐢ㄧ▼搴忋?span lang="EN-US">
鍏充簬 SetUnhandleExceptionFilter 鍑芥暟鐨勫叿浣撶敤娉曞拰紺轟緥璇峰弬鑰?span lang="EN-US">MSDN銆?span lang="EN-US">
2銆?span lang="EN-US">StackWalker
鐜板湪鎴戜滑宸茬粡鏈夋満浼?xì)鍙互鍦?span lang="EN-US">crash涔嬪墠瀵圭▼搴忕姸鎬佷俊鎭繘琛屽鐞嗕簡錛屽彧闇瑕佺敓鎴愬茍淇濆瓨鍫嗘爤淇℃伅灝卞ぇ鍔熷憡鎴愪簡銆?span lang="EN-US">Windows鐨?span lang="EN-US">dbghelp.dll搴撴彁渚涗簡涓涓嚱鏁板彲浠ュ緱鍒板綋鍓嶅爢鏍堜俊鎭細(xì)StackWalk64錛堝湪Win2K浠ュ墠鐗堟湰涓負(fù)StackWalk錛夈傝鍑芥暟澹版槑濡備笅錛?span lang="EN-US">
BOOL WINAPI StackWalk64(
__in DWORD MachineType,
__in HANDLE hProcess,
__in HANDLE hThread,
__in_out LPSTACKFRAME64 StackFrame, __in_out PVOID ContextRecord,
__in PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, __in PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, __in PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, __in PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress ); 璇ュ嚱鏁扮殑鍏蜂綋鐢ㄦ硶鍙互鍙傝?span lang="EN-US">MSDN銆傚湪榪欓噷鎺ㄨ崘涓涓墰浜哄啓濂界殑StackWalker錛屽彲浠ョ洿鎺ユ嬁鏉ョ敤錛屽紑婧愮殑銆?span lang="EN-US">StackWalker鎻愪緵浜嗕竴涓熀綾伙紝緇欏嚭浜嗗嚑涓畝鍗曠殑鎺ュ彛錛屽彲浠ユ柟渚垮湴鐢熸垚鍫嗘爤淇℃伅錛屽茍涓旀敮鎸佷竴緋誨垪VC鐗堟湰錛岄潪甯稿ソ鐢ㄣ傛垜浠彲浠ヨ嚜宸卞啓涓涓瓙綾伙紝騫墮噸杞借櫄鍑芥暟OnOutput錛屽氨鍙互灝嗗爢鏍堜俊鎭緭鍑轟負(fù)鐗瑰畾鏍煎紡浜嗐?span lang="EN-US">StackWalker鐨勫湴鍧涓猴細(xì)http://www.codeproject.com/KB/threads/StackWalker.aspx銆?/span>
涓嶈繃瀵逛簬Release鐗堟湰鏉ヨ錛?span lang="EN-US">StackWalk64鍑芥暟鑾峰緱鐨勫爢鏍堜俊鎭湁鍙兘涓嶅畬鏁淬傚鏋滃紓甯告槸鐢?span lang="EN-US">MFC鐨勬ā鍧楁姏鍑猴紝閭d箞鑾峰緱鐨勫爢鏍堝彲鑳界己灝戝墠闈㈣皟鐢ㄦā鍧椾俊鎭傚彟澶栵紝StackWalk64闇瑕佹渶鏂扮殑dbghelp.dll鏂囦歡鏀寔鎵嶈兘宸ヤ綔錛涜姝g‘杈撳嚭crash鐨勫嚱鏁板悕鍜岃鍙鳳紝闇瑕佽pdb鏂囦歡鏀寔銆備互涓婁笉瓚蟲湁鍙兘褰卞搷杈撳嚭淇℃伅鐨勫畬鏁存у拰鏁堟灉錛岃屽浜庡彂甯冨湪澶栫殑紼嬪簭錛岃甯︿笂pdb鏂囦歡鍑犱箮涓嶅彲鑳斤紝鍥犳榪欎釜鏂規(guī)榪樻槸鏈夌己鎲劇殑錛屾瘮杈冮傜敤浜庢湰鍦扮殑release鐗堟湰璋冭瘯銆?span lang="EN-US">
褰撴垜浠妸鑷繁鐨?span lang="EN-US">release鐗堟湰紼嬪簭鍙戝竷鍑哄幓浠ュ悗錛屼竴鑸兘鏄湪鐢ㄦ埛鐨勬満鍣ㄤ笂榪愯銆傝繖縐嶆儏鍐典笅錛屽浜庣鍥涚鏂規(guī)錛屽洜涓洪渶瑕?span lang="EN-US">pdb鏂囦歡鎵嶈兘澶熸紜敓鎴愬爢鏍堣皟鐢ㄧ殑鍑芥暟琛屽彿鍙婁唬鐮佽鍙鳳紝鍥犳鏂規(guī)鍥涘彧閫傜敤浜庢湰鍦?span lang="EN-US">release鐗堢殑璋冭瘯錛屽惁鍒欏彧鑳界敓鎴愪笉瀹屾暣鐨勫爢鏍堜俊鎭傚浜庡墠涓夌鏂規(guī)錛屽叾瀹炲彧闇瑕佺敤鎴峰憡鐭ュ穿婧冨湴鍧錛岀劧鍚庡湪鏈湴鏌ユ壘crash鍦板潃灝卞彲浠ヤ簡錛屼絾鏄畾浣?span lang="EN-US">crash鐨勮繃紼嬮潪甯鎬笉鏂逛究錛屽鏋?span lang="EN-US">crash鐨勬儏鍐墊瘮杈冨錛屽墠涓夌鏂規(guī)閮戒笉鍚堥傘傝屼笖錛屽墠涓夌鏂規(guī)鍧囦笉鑳界敓鎴愬爢鏍堣皟鐢ㄤ俊鎭紝瀵逛簬debug鐨勪綔鐢ㄦ湁闄愩?span lang="EN-US">
涓嬮潰鎴戜滑灝辨潵鐪嬩竴涓洿鍔犲畬鍠勭殑瑙e喅鏂規(guī)銆?span lang="EN-US">
鏂規(guī)浜旓細(xì)SetUnhandledExceptionFilter + Minidump
SetUnhandleExceptionFilter鍑芥暟鎴戜滑宸茬粡浠嬬粛榪囦簡錛屾湰鏂規(guī)鐨勬濊礬榪樻槸瑕佸埄鐢ㄦ垜浠嚜宸辯殑寮傚父澶勭悊鍑芥暟錛屾潵鐢熸垚minidump鏂囦歡銆?span lang="EN-US">
1銆?span lang="EN-US">Minidump姒傚康
minidump錛堝皬瀛樺偍鍣ㄨ漿鍌級鍙互鐞嗚В涓轟竴涓?span lang="EN-US">dump鏂囦歡錛岄噷闈㈣褰曚簡鑳藉甯姪璋冭瘯crash鐨勬渶灝忔湁鐢ㄤ俊鎭傚疄闄呬笂錛屽鏋滀綘鍦?緋葷粺灞炴?span lang="EN-US"> -> 楂樼駭 -> 鍚姩鍜屾晠闅滄仮澶?span lang="EN-US"> -> 璁劇疆 -> 鍐欏叆璋冭瘯淇℃伅 涓夋嫨鈥?/span>灝忓唴瀛樿漿鍌?span lang="EN-US">(64 KB)鈥?/span>鐨勮瘽錛屽綋緋葷粺鎰忓鍋滄鏃墮兘浼?xì)鍦?span lang="EN-US">C:\Windows\Minidump\璺緞涓嬬敓鎴愪竴涓?span lang="EN-US">.dmp鍚庣紑鐨勬枃浠訛紝榪欎釜鏂囦歡灝辨槸minidump鏂囦歡錛屽彧涓嶈繃榪欎釜鏄唴鏍告佺殑minidump銆?span lang="EN-US">
鎴戜滑瑕佺敓鎴愮殑鏄敤鎴鋒佺殑minidump錛屾枃浠朵腑鍖呭惈浜嗙▼搴忚繍琛岀殑妯″潡淇℃伅銆佺嚎紼嬩俊鎭佸爢鏍堣皟鐢ㄤ俊鎭瓑銆傝屼笖涓轟簡絎﹀悎鍏?span lang="EN-US">mini鐨勭壒鎬э紝dump鏂囦歡鏄帇緙╄繃鐨勩?span lang="EN-US">
2銆佺敓鎴?span lang="EN-US">minidump鏂囦歡
鐢熸垚minidump鏂囦歡鐨?span lang="EN-US">API鍑芥暟鏄?span lang="EN-US">MiniDumpWriteDump錛岃鍑芥暟闇瑕?span lang="EN-US">dbghelp.lib鏀寔錛屽叾鍘熷瀷濡備笅:
BOOL WINAPI MiniDumpWriteDump(
__in HANDLE hProcess,
__in DWORD ProcessId,
__in HANDLE hFile,
__in MINIDUMP_TYPE DumpType, __in PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, __in PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, __in PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); 鍦ㄦ垜浠殑寮傚父澶勭悊鍑芥暟涓姞鍏ヤ互涓嬩唬鐮侊細(xì)
HANDLE hFile = ::CreateFile( _T("E:\\dumpfile.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( hFile != INVALID_HANDLE_VALUE)
{ MINIDUMP_EXCEPTION_INFORMATION einfo; einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = pExInfo; einfo.ClientPointers = FALSE; ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hFile, MiniDumpNormal, &einfo, NULL, NULL); ::CloseHandle(hFile); } 鍏朵腑錛?span lang="EN-US">pExInfo鍙橀噺涓哄紓甯稿鐞嗗嚱鏁?span lang="EN-US">PEXCEPTION_POINTERS綾誨瀷鐨勫弬鏁般傚叿浣撹鍙傝?span lang="EN-US">MSDN銆?span lang="EN-US">
3銆佽皟璇?span lang="EN-US">minidump
璋冭瘯dump鏂囦歡棣栧厛闇瑕?span lang="EN-US">pdb鏂囦歡錛屽洜姝ゆ垜浠?span lang="EN-US">build紼嬪簭鏃墮渶瑕佽緗?span lang="EN-US"> Debug Infomation Format 涓?span lang="EN-US"> 鈥淧rogram Database錛?span lang="EN-US">/Zi錛?span lang="EN-US">鈥?/span>銆傚叾嬈★紝鎴戜滑榪樿紜繚鎵鐢ㄧ殑dump鏂囦歡涓庢簮浠g爜銆?span lang="EN-US">exe銆?span lang="EN-US">pdb鏂囦歡鐗堟湰鏄竴鑷寸殑錛岃繖瑕佹眰鎴戜滑蹇呴』緇存姢濂界▼搴忕増鏈俊鎭?span lang="EN-US">
璋冭瘯minidump鏈鏂逛究鐨勭幆澧冨氨鏄?span lang="EN-US">VS浜嗭紝鎴戜滑鍙灝?span lang="EN-US">.dmp銆?span lang="EN-US">.exe銆?span lang="EN-US">.pdb鏂囦歡鏀懼湪涓涓礬寰勪笅錛屼繚璇佹簮浠g爜鏂囦歡鐨勮礬寰勪笌緙栬瘧鏃剁殑璺緞涓鑷村氨鍙互浜嗭紝鍓╀笅鐨勫氨鏄?span lang="EN-US">VS甯垜浠畬鎴愩傚弻鍑?span lang="EN-US">.dmp鏂囦歡鎴栬呭湪鏂囦歡鎵撳紑宸ョ▼涓夋嫨鈥渄ump files鈥?/span>錛屽姞杞?span lang="EN-US">dump鏂囦歡錛岀劧鍚庢寜F5榪愯灝辮兘鐩存帴鎭㈠crash鏃剁殑鐜板満浜嗭紝浣犲彲浠ュ畾浣?span lang="EN-US">crash鐨勪唬鐮侊紝鍙互鏌ョ湅璋冪敤鍫嗘爤錛屽彲浠ユ煡鐪嬬嚎紼嬪拰妯″潡淇℃伅...涓鍒囬兘璺熶綘璁劇疆鏂偣璋冭瘯涓鏍鳳紝澶己澶т簡錛佺湅涓埅鍥懼惂銆?span lang="EN-US">
闇瑕佹敞鎰忕殑鏄紝瀵逛簬release鐗堢殑紼嬪簭鏉ヨ錛屽緢澶氫唬鐮佹槸緇忚繃緙栬瘧鍣ㄤ紭鍖栬繃鐨勶紝鍥犳瀹氫綅鐨勬椂鍊欏彲鑳戒細(xì)鏈夋墍鍋忓樊錛屽ぇ瀹跺彲浠ヨ冭檻璁劇疆閫夐」鍘繪帀浠g爜浼樺寲銆?span lang="EN-US">
鍏朵粬鍙互璋冭瘯minidump鐨勫伐鍏瘋繕鏈?span lang="EN-US">WinDbg絳夛紝澶у鍙互鏌ラ槄鐩稿叧璧勬枡銆?span lang="EN-US">
]]>
涓轟簡嫻嬭瘯榪欎釜API, 鍙傝冪綉涓婁竴浜涜祫鏂?span lang="EN-US">, 鍐欎簡涓涓畝鍗曠殑C++ 紼嬪簭. 鐩殑鏄綋鏈夊紓甯稿彂鐢熺殑鏃跺?span lang="EN-US">, 鑷姩鐢熸垚Dump鏂囦歡渚涗箣鍚庣殑鍒嗘瀽. 鏈変簡Dump鏂囦歡, 鎴戜滑灝卞彲浠ヤ嬌鐢?span lang="EN-US">WinDBG絳夎皟璇曞櫒鏉ュ垎鏋愬紓甯稿彂鐢熸椂鐨勬儏鍐?span lang="EN-US">. 鍏跺疄榪欎釜鍔熻兘寰堝杞歡閮芥湁, 姣斿QQ, 欖斿吔涓栫晫, 絳夌瓑. 瀹冧滑鍦ㄥ嚭鐜頒簡寮傚父鐨勬椂鍊欎細(xì)寮瑰嚭涓涓璇濇, 璁╃敤鎴瘋緭鍏ュ紓甯稿彂鐢熸椂鐨勬儏鍐?span lang="EN-US">, 鐒跺悗鎶婂紓甯哥殑dump鏂囦歡鐢?span lang="EN-US">email鍙戝洖, 渚涘紑鍙戣呬滑鍒嗘瀽淇敼bug.
涓嶈繃鏈変竴鐐?span lang="EN-US">, 榪欓噷闇瑕佺▼搴忕殑璋冭瘯絎﹀彿鏂囦歡(pdb鏂囦歡). 瀵逛簬Debug鐗堟潵璇?span lang="EN-US">, 鏄敓鎴愮殑, 浣嗘槸Release鐗堟潵璇撮粯璁ゆ槸涓嶇敓鎴愮殑. 鍙互璁劇疆VC鐨勭紪璇戝櫒, 璁╁畠鍦?span lang="EN-US">Release鐗堢殑鏃跺欎篃鐢熸垚璋冭瘯淇℃伅. 榪欏甫鏉ヤ竴涓柊鐨勯棶棰?span lang="EN-US">, 鍥犱負(fù).pdb閲岄潰鏄繚瀛樹簡婧愭枃浠剁殑淇℃伅鐨?span lang="EN-US">, 涓轟簡閬垮厤娉勫瘑, 鍙互閲囩敤VS涓殑CVPack宸ュ叿, 浠庝腑鍘婚櫎鏁忔劅鐨勪俊鎭?span lang="EN-US">.
紼嬪簭闇瑕佷嬌鐢?b>Dbghelp.h 鍜?Dbghelp.lib . 瀹冧滑鍙互浠?span lang="EN-US">MSDN鎵懼埌.
//鏈涓昏鐨勫嚱鏁?span lang="EN-US">, 鐢熸垚Dump
static void DumpMiniDump(HANDLE hFile, PEXCEPTION_POINTERS excpInfo)
{
if (excpInfo == NULL) //濡傛灉娌℃湁浼犲叆寮傚父, 姣斿鏄湪紼嬪簭閲岄潰璋冪敤鐨?span lang="EN-US">, 鐢熸垚涓涓紓甯?/span>
{
// Generate exception to get proper context in dump
__try
{
OutputDebugString(_T("raising exception\r\n"));
RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);
}
__except(DumpMiniDump(hFile, GetExceptionInformation()),
EXCEPTION_CONTINUE_EXECUTION)
{
}
}
else
{
OutputDebugString(_T("writing minidump\r\n"));
MINIDUMP_EXCEPTION_INFORMATION eInfo;
eInfo.ThreadId = GetCurrentThreadId(); //鎶婇渶瑕佺殑淇℃伅娣昏繘鍘?/span>
eInfo.ExceptionPointers = excpInfo;
eInfo.ClientPointers = FALSE;
// 璋冪敤, 鐢熸垚Dump. 98涓嶆敮鎸?span lang="EN-US">
// Dump鐨勭被鍨嬫槸灝忓瀷鐨?span lang="EN-US">, 鑺傜渷絀洪棿. 鍙互鍙傝?span lang="EN-US">MSDN鐢熸垚鏇磋緇嗙殑Dump.
MiniDumpWriteDump(
GetCurrentProcess(),
GetCurrentProcessId(),
hFile,
MiniDumpNormal,
excpInfo ? &eInfo : NULL,
NULL,
NULL);
}
}
涓嬮潰鐨勬槸紼嬪簭閮ㄥ垎:
int _tmain(int argc, _TCHAR* argv[])
{
// 鍒涘緩涓涓?span lang="EN-US">Dump鏂囦歡
HANDLE hFile = CreateFile( _T("MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
int code;
__try
{
// 鎶婅嚜宸卞疄鐜扮殑main鍑芥暟鍖呰涓涓?span lang="EN-US">, 鏀懼湪try .. except 鍧椾腑. 榪欐牱鍑虹幇浜嗗紓甯稿彲浠ヨ嚜鍔ㄧ敓鎴?span lang="EN-US">dump
main_wrapper(argc, argv);
}
__except( code=GetExceptionCode(), DumpMiniDump(hFile, GetExceptionInformation() ), EXCEPTION_EXECUTE_HANDLER ) //鍑虹幇浜嗗紓甯?span lang="EN-US">, 璁板綍寮傚父鐨?span lang="EN-US">code, 鐢熸垚dump!!
{
printf("%x\n", code);
wchar_t msg[512];
wsprintf(msg, L"Exception happened. Exception code is %x", code);
MessageBox(NULL, msg, L"Exception", MB_OK); //鏄劇ず娑堟伅緇欑敤鎴?/span>
}
CloseHandle( hFile ); //鍏抽棴Dump鏂囦歡
getchar();
return 0;
}
鏈涓嬮潰鏄袱涓祴璇曠殑鍑芥暟, main_wrapper鍑芥暟灝嗚皟鐢?span lang="EN-US">test1, test1灝嗕細(xì)鐢熸垚涓涓紓甯?span lang="EN-US">(闈炴硶鍐呭瓨鍐?span lang="EN-US">)
void test1() {
int *p;
p = (int*)0x100;
*p = 0; //鍐?span lang="EN-US">0x100鍦板潃, 榪欎釜鏄潪娉曠殑
}
void main_wrapper(int argc, _TCHAR* argv[]) {
test1();
}
榪愯, 寮傚父琚崟鑾蜂簡:
鍚屾椂, dump鏂囦歡涔熺敓鎴愪簡:
鐢?span lang="EN-US">WinDBG鎵撳紑Dump鏂囦歡, 鍙互娓呮鐨勭湅鍑哄紓甯稿嚭鐜扮殑鎯呭喌:![]()
浠庝腑鍙互姣旇緝娓呮鐨勭湅鍒板紓甯稿彂鐢熺殑鎯呭喌(Exception code), 寮傚父鍑虹幇鐨勫湴鍧(test1鍑芥暟, 鍋忕Щ0x28). 鍥犱負(fù)榪欐嫻嬭瘯鐨勬槸Debug鐗?span lang="EN-US">, 鏈変繚瀛樹簡婧愪唬鐮佺殑.pdb鏂囦歡, 鎵浠?span lang="EN-US">WinDbg鎶婃簮浠g爜涔熷垪鍑烘潵浜?span lang="EN-US">. 榪欐牱鍙互闈炲父瀹規(guī)槗鐨勫彂鐜伴棶棰?span lang="EN-US">.
============================================
鍙傝?span lang="EN-US">:
DbgHelp涓殑DumpAPI渚嬪瓙: http://www.debuginfo.com/examples/src/effminidumps/MiniDump.cpp
CrashReport: 紼嬪簭鍑虹幇寮傚父鐨勬椂鍊欐樉紺哄彂閫侀敊璇殑瀵硅瘽妗?span lang="EN-US">, 騫舵妸Dump鏂囦歡鍙戦佸埌鎸囧畾鐨勫湴鍧. http://code.google.com/p/crashrpt/
XCrashReport: 涓庝笂闈㈢殑綾諱技鐨勪竴涓紑婧愰」鐩?span lang="EN-US">. http://www.codeproject.com/KB/debug/XCrashReportPt1.aspx
銆銆絎﹀彿鏂囦歡錛?span lang="EN-US">Symbol Files錛夋槸涓涓暟鎹俊鎭枃浠訛紝瀹冨寘鍚簡搴旂敤紼嬪簭浜岃繘鍒舵枃浠訛紙姣斿錛?span lang="EN-US">EXE銆?span lang="EN-US">DLL絳夛級璋冭瘯淇℃伅錛屼笓闂ㄧ敤鏉ヤ綔璋冭瘯涔嬬敤錛屾渶緇堢敓鎴愮殑鍙墽琛屾枃浠跺湪榪愯鏃跺茍涓嶉渶瑕佽繖涓鍙鋒枃浠訛紝浣嗕綘鐨勭▼搴忎腑鎵鏈夌殑鍙橀噺淇℃伅閮借褰曞湪榪欎釜鏂囦歡涓傛墍浠ヨ皟璇曞簲鐢ㄧ▼搴忔椂錛岃繖涓枃浠舵槸闈炲父閲嶈鐨勩傜敤 Visual C++ 鍜?span lang="EN-US"> WinDbg 璋冭瘯紼嬪簭鏃墮兘瑕佺敤鍒拌繖涓枃浠躲?span lang="EN-US">
銆銆鍦?span lang="EN-US"> Windows 緋葷粺涓紝絎﹀彿鏂囦歡浠?span lang="EN-US"> .pdb 涓烘墿灞曞悕錛屾瘮濡傦細(xì)姣忎釜 Windows 鎿嶄綔緋葷粺涓嬫湁涓涓?span lang="EN-US"> GDI32.dll 鏂囦歡錛岀紪璇戝櫒鍦ㄧ紪璇戣 DLL 鐨勬椂鍊欎細(xì)浜х敓涓涓?span lang="EN-US"> GDI32.pdb 鏂囦歡錛屼竴鏃︿綘鎷ユ湁浜嗚繖涓?span lang="EN-US"> PDB 鏂囦歡錛岄偅涔堜究鍙互鐢ㄥ畠鏉ヨ皟璇曞茍璺熻釜鍒?span lang="EN-US"> GDI32.dll 鍐呴儴銆傝鏂囦歡鍜屼簩榪涘埗鏂囦歡鐨勭紪璇戠増鏈瘑鍒囩浉鍏籌紝姣斿淇敼浜?span lang="EN-US"> DLL 鐨勮緭鍑哄嚱鏁幫紝鍐嶇紪璇戣 DLL錛岄偅涔堝師鍏堢殑 PDB 鏂囦歡灝辮繃鏃朵簡錛屼笉鑳藉啀鐢ㄨ佺殑 PDB 鏂囦歡鏉ュ仛璋冭瘯宸ヤ綔,鑰屽繀欏諱嬌鐢ㄦ渶鏂扮殑 PDB 鏂囦歡鐗堟湰銆?span lang="EN-US">
銆銆Visual C++ 緙栬瘧浠g爜鍚庝細(xì)鍦?span lang="EN-US"> Debug 鎴栬?span lang="EN-US"> Release 鐩綍涓嬬敓鎴愪竴涓?span lang="EN-US"> PDB 鏂囦歡銆備竴鑸儏鍐典笅錛岀鍙鋒枃浠跺寘鎷互涓嬬殑鏁版嵁淇℃伅錛?span lang="EN-US">
浜屻佸浣曞緱鍒板拰瀹夎絎﹀彿鏂囦歡?
瀹夎絎﹀彿鏂囦歡鐨勬敞鎰忎簨欏癸細(xì)
銆銆濡傛灉鏄墜鍔ㄥ畨瑁呯鍙鋒枃浠訛紝鏈変竴鐐瑰緢閲嶈錛岄偅灝辨槸瀹夸富鏈猴紙Hostt Computer錛変笂鐨勭鍙鋒枃浠跺繀欏諱笌鐩爣鏈哄櫒錛?span lang="EN-US">Target Computer錛変笂鐨?span lang="EN-US"> Windows 鐗堟湰鐩稿尮閰嶃?span lang="EN-US">
銆銆榪欓噷鎵璋撶殑瀹夸富鏈烘寚鐨勬槸榪愯璋冭瘯浼?xì)璇濈殑鏈哄櫒锛屽湪鍏稿瀷鐨勫弻绯痪l熻皟璇曚細(xì)璇濈幆澧冧腑錛屽涓繪満鍙互鏄繛鎺ュ埌鐩爣鏈哄櫒鐨勪換浣曟満鍣ㄣ傜洰鏍囨満鍣ㄦ寚鐨勬槸鍙戠敓杞歡緇勪歡銆佺郴緇熸湇鍔°佸簲鐢ㄧ▼搴忔垨鎿嶄綔緋葷粺榪愯澶辮觸鐨勬満鍣ㄣ備篃鍗蟲槸闇瑕佽璋冭瘯鐨勬満鍣紝瀹冩槸璋冭瘯浼?xì)璇濆呄x敞鐨勭劍鐐廣傜洰鏍囨満鍣ㄥ彲浠ヨ繎鍦ㄥ挮灝猴紝涔熷彲浠ヤ綅浜庡畬鍏ㄤ笉鍚岀殑鍦版柟銆傛湁鏃舵垜浠篃灝嗙洰鏍囨満鍣ㄧО涔嬩負(fù)鈥斺?/span>琚皟璇曡咃紙debuggee錛夛紝閭d箞涓庝箣瀵瑰簲錛屽涓繪満鍒欏彲浠ョО涓鴻皟璇曡咃紙debugger錛夈?span lang="EN-US">
涓夈佸湪 Visual C++ 浣跨敤絎﹀彿鏂囦歡鐨勬柟娉?/span>
鍦?span lang="EN-US"> Visual C++ 6.0 涓殑浣跨敤鏂規(guī)硶錛?span lang="EN-US">
鍦?span lang="EN-US"> Visual C++ .NET 2003 涓殑浣跨敤鏂規(guī)硶錛?span lang="EN-US">
鍥涖佸浣曚駭鐢?span lang="EN-US"> Release 鐗堟湰浜岃繘鍒舵枃浠跺搴旂殑 PDB 鏂囦歡?
鍦?span lang="EN-US"> Visual C++ 6.0 涓殑鏂規(guī)硶錛?span lang="EN-US">
鍦?span lang="EN-US"> Visual C++ .NET 2003 涓殑鏂規(guī)硶錛?span lang="EN-US">
浜斻佸叧浜?span lang="EN-US"> Free Build錛堜篃縐?span lang="EN-US"> Retail Build錛夊拰 Checked Build錛堜篃縐?span lang="EN-US"> Debug Build錛?/span>
姣忎釜鍩轟簬 NT 鎿嶄綔緋葷粺鏈変袱縐嶄笉鍚岀殑紼嬪簭鐢熸垚妯″紡錛屽嵆錛?span lang="EN-US">
銆銆Free Build 鐢熸垚鐨勬槸鏈緇堢敤鎴風(fēng)増鏈紝閽堝鐢熸垚鐨勪簩榪涘埗鏂囦歡榪涜浜嗗交搴曠殑浼樺寲錛岀鐢ㄤ簡璋冭瘯鏂█錛屽茍鍓ョ浜嗚皟璇曚俊鎭傝繖鏍蜂竴鏉ヤ嬌鍙墽琛岀▼搴忔枃浠舵洿灝忥紝鍔犺澆鏇村揩錛屼嬌鐢ㄧ殑鍐呭瓨涔熸洿灝忋?span lang="EN-US">
銆銆Checked Build 鐢熸垚鐨勬槸嫻嬭瘯鍜岃皟璇曠増鏈傚畠鍖呭惈棰濆鐨?span lang="EN-US"> Free Build 鎵娌℃湁鐨勯敊璇鏌ワ紝鍙傛暟楠岃瘉鍜岃皟璇曚俊鎭紝Checked Build 鏈夊姪浜庨殧紱誨拰璺熻釜鍙兘瀵艱嚧涓嶅彲棰勮鐨勮涓虹殑闂錛屾瘮濡傚唴瀛樻孩鍑猴紝涓嶆紜殑璁懼閰嶇疆銆傝櫧鐒?span lang="EN-US"> Checked Build 鎻愪緵浜嗛澶栫殑淇濇姢錛屼絾涓?span lang="EN-US"> Free Build 姣旇緝錛屽畠闇瑕佹洿澶氱殑鍐呭瓨寮閿鍜岀鐩樼┖闂淬傜敱浜庡彲鎵ц紼嬪簭鍖呭惈絎﹀彿璋冭瘯淇℃伅錛涜皟璇曟椂瑕佹墽琛岄檮鍔犵殑浠g爜銆佸弬鏁版鏌ュ拰杈撳嚭璋冭瘯璇婃柇淇℃伅錛屼粠鑰屽鑷存ц兘涓嬮檷銆?span lang="EN-US">
鍏佺郴緇熺鍙鋒枃浠剁殑鏇存柊鏂規(guī)硶
銆銆緋葷粺絎﹀彿鏂囦歡鎸?span lang="EN-US"> Windows 鎿嶄綔緋葷粺渚濊禆鐨勯偅鍑犱釜閲嶈鐨?span lang="EN-US"> DLL/SYS 鍜屽彲鎵ц鏂囦歡瀵瑰簲鐨勭鍙鋒枃浠訛紝甯歌鐨勬瘮濡傦細(xì)gdi32.dll銆?span lang="EN-US">Kernel32.dll銆?span lang="EN-US">Kerberos.dll銆?span lang="EN-US">psapi.dll銆?span lang="EN-US">user32.dll絳夛紝浣跨敤 WinDbg 璋冭瘯鏃訛紝浣犲氨浼?xì)鍙戠幇绯痪l熺鍙鋒枃浠?span lang="EN-US">(PDB)鏈夊閲嶈錛岃繖浜涙枃浠墮兘涓庢湰鍦扮殑 OS 瀵嗗垏鐩稿叧錛屾瘮濡傦紝Windows 2000 鎵撲簡SP琛ヤ竵鐨勮瘽錛岄偅涔堝繀欏繪洿鏂扮郴緇熺鍙鋒枃浠舵墠鑳借繘琛岀浉鍏寵皟璇曪紝鍘熸潵鐨勭鍙鋒枃浠朵笌鎵撹ˉ涓佸悗鐨勭郴緇熷氨浼?xì)涓嶅寶w厤錛屾庝箞鍔炲憿? 鍙互閫氳繃緗戠粶鏉ユ洿鏂幫紒璞′笅闈㈣繖鏍峰湪 WinDbg 鐨?span lang="EN-US"> Symbols Path 閲岄潰杈撳叆璺緞錛?span lang="EN-US">
SRV*D:\Symbols\websymbols*http://msdl.microsoft.com/download/symbols
錛堟枩浣撻儴鍒嗘槸浣犲湪鏈湴淇濆瓨絎﹀彿鏂囦歡鐨勮礬寰勶級
銆銆濡傛灉浣犱笉鏄氳繃浠g悊涓婄綉錛岄偅涔堝湪浣犵敤 WinDbg 鎵撳紑涓涓璋冭瘯紼嬪簭鍚庯紝杈撳叆 symchk 鍥炶濺錛?span lang="EN-US">WinDbg 灝變細(xì)鑷姩鐨勮繛鍒板井杞殑緗戠珯鏍規(guī)嵁浣犵殑鏈哄櫒鐨勬儏鍐墊洿鏂扮殑 PDB 鏂囦歡錛屽茍灝嗗畠淇濆瓨鍦ㄤ笂闈㈡枩浣撻儴鍒嗘寚瀹氱殑鏈湴璺緞閲岋紝榪欐牱浣犲氨鍙互紜繚浣犵殑絎﹀彿鏂囦歡鐗堟湰鍜屼綘鏈哄櫒涓婄殑鏂囦歡鐗堟湰涓鑷淬?span lang="EN-US">
濡傛灉浣犳槸閫氳繃浠g悊涓婄綉閭d箞浣犻渶瑕侀厤緗?span lang="EN-US"> IE 鐨勮繛鎺ヨ緗傚叿浣撴柟娉曟仌涓嶈禈璦
void CForDebugDlg::OnOK()
{
for (int i = 0; i < 1000; i++) //A
{
int k = i * 10 - 2; //B
SendTo(k); //C
int tmp = DoSome(i); //D
int j = i / tmp; //E
}
}
鎵ц姝ゅ嚱鏁幫紝紼嬪簭宕╂簝浜?span lang="EN-US">E琛岋紝鍙戠幇姝ゆ椂tmp涓?span lang="EN-US">0錛屽亣璁?span lang="EN-US">tmp鏈笉搴旇涓?span lang="EN-US">0錛屾庝箞榪欎釜鏃跺欎負(fù)0鍛紵鎵浠ユ渶濂借兘澶熻窡韙嬈″驚鐜椂DoSome鍑芥暟鏄浣曡繍琛岀殑錛屼絾鐢變簬鏄湪寰幆浣撳唴錛屽鏋滃湪E琛岃緗柇鐐癸紝鍙兘闇瑕佹寜F5錛?span lang="EN-US">GO錛夎澶氭銆傝繖鏍鋒墜瑕佷笉鍋滅殑鎸夛紝寰堢棝鑻︺備嬌鐢?span lang="EN-US">VC6鏂偣淇グ鏉′歡灝卞彲浠ヨ交鏄撹В鍐蟲闂銆傛楠ゅ涓嬨?span lang="EN-US">
1 Ctrl+B鎵撳紑鏂偣璁劇疆妗嗭紝濡備笅鍥撅細(xì) ![]()
Figure 1璁劇疆楂樼駭浣嶇疆鏂偣
2 鐒跺悗閫夋嫨D琛屾墍鍦ㄧ殑鏂偣錛岀劧鍚庣偣鍑?span lang="EN-US">condition鎸夐挳錛屽湪寮瑰嚭瀵硅瘽妗嗙殑鏈涓嬮潰涓涓紪杈戞涓緭鍏ヤ竴涓緢澶ф暟鐩紝鍏蜂綋瑙嗗簲鐢ㄨ屽畾錛岃繖閲?span lang="EN-US">1000灝卞浜嗐?span lang="EN-US">
3 鎸?span lang="EN-US">F5閲嶆柊榪愯紼嬪簭錛岀▼搴忎腑鏂?span lang="EN-US">Ctrl+B鎵撳紑鏂偣妗嗭紝鍙戠幇姝ゆ柇鐐瑰悗璺熼殢涓涓茶鏄庯細(xì)...487 times remaining銆傛剰鎬濇槸榪樺墿涓?span lang="EN-US">487嬈℃病鏈夋墽琛岋紝閭e氨鏄鎵ц鍒?span lang="EN-US">513錛?span lang="EN-US">1000錛?span lang="EN-US">487錛夋鏃跺欏嚭閿欑殑銆傚洜姝わ紝鎴戜滑鎸夋楠?span lang="EN-US">2鎵璁詫紝鏇存敼姝ゆ柇鐐圭殑skip嬈℃暟,灝?span lang="EN-US">1000鏀逛負(fù)513銆?span lang="EN-US">
4 鍐嶆閲嶆柊榪愯紼嬪簭錛岀▼搴忔墽琛屼簡513嬈″驚鐜紝鐒跺悗鑷姩鍋滃湪鏂偣澶勩傝繖鏃訛紝鎴戜滑灝卞彲浠ヤ粩緇嗘煡鐪?span lang="EN-US">DoSome鏄浣曡繑鍥?span lang="EN-US">0鐨勩傝繖鏍鳳紝浣犲氨閬垮厤浜嗘墜鎸囩殑鐥涜嫤錛岃妭鐪佷簡鏃墮棿銆?span lang="EN-US">
鍐嶇湅浣嶇疆鏂偣鍏朵粬淇グ鏉′歡銆傚Figure 1鎵紺猴紝鍦?span lang="EN-US">鈥淓nter the expression to be evaluated:鈥?/span>涓嬮潰錛屽彲浠ヨ緭鍏ヤ竴浜涙潯浠訛紝褰撹繖浜涙潯浠舵弧瓚蟲椂錛屾柇鐐規(guī)墠鍚姩銆傝濡傦紝鍒氭墠鐨勭▼搴忥紝鎴戜滑闇瑕?span lang="EN-US">i涓?span lang="EN-US">100鏃剁▼搴忓仠涓嬫潵錛屾垜浠氨鍙互杈撳叆鍦ㄧ紪杈戞涓緭鍏?span lang="EN-US">鈥渋==
鍙﹀錛屽鏋滃湪姝ょ紪杈戞涓鏋滃彧杈撳叆鍙橀噺鍚嶇О錛屽垯鍙橀噺鍙戠敓鏀瑰彉鏃訛紝鏂偣鎵嶄細(xì)鍚姩銆傝繖瀵規(guī)嫻嬩竴涓彉閲忎綍鏃惰淇敼寰堟柟渚匡紝鐗瑰埆瀵逛竴浜涘ぇ紼嬪簭銆?span lang="EN-US">
鐢ㄥソ浣嶇疆鏂偣鐨勪慨楗版潯浠訛紝鍙互澶уぇ鏂逛究瑙e喅鏌愪簺闂銆?span lang="EN-US">
浜?鏁版嵁鏂偣錛?span lang="EN-US">Data Breakpoint錛?/b>
杞歡璋冭瘯榪囩▼涓紝鏈夋椂浼?xì)鍙戠庮C竴浜涙暟鎹細(xì)鑾悕鍏跺鐨勮淇敼鎺夛紙濡備竴浜涙暟緇勭殑瓚婄晫鍐欏鑷磋鐩栦簡鍙﹀鐨勫彉閲忥級錛屾壘鍑轟綍澶勪唬鐮佸鑷磋繖鍧楀唴瀛樿鏇存敼鏄竴浠舵鎵嬬殑浜嬫儏錛堝鏋滄病鏈夎皟璇曞櫒鐨勫府鍔╋級銆傛伆褰撹繍鐢ㄦ暟鎹柇鐐瑰彲浠ュ揩閫熷府浣犲畾浣嶄綍鏃朵綍澶勮繖涓暟鎹淇敼銆傝濡備笅闈竴孌電▼搴忥細(xì)
#include "stdafx.h"
#include
int main(int argc, char* argv[])
{
char szName1[10];
char szName2[4];
strcpy(szName1,"shenzhen");
printf("%s\n", szName1); //A
strcpy(szName2, "vckbase"); //B
printf("%s\n", szName1);
printf("%s\n", szName2);
return 0;
}
榪欐紼嬪簭鐨勮緭鍑烘槸
szName1: shenzhen
szName1: ase
szName2: vckbase
szName1浣曟椂琚慨鏀瑰憿錛熷洜涓烘病鏈夋槑鏄劇殑淇敼szName1浠g爜銆傛垜浠彲浠ラ鍏堝湪A琛岃緗櫘閫氭柇鐐癸紝F5榪愯紼嬪簭錛岀▼搴忓仠鍦?span lang="EN-US">A琛屻傜劧鍚庢垜浠啀璁劇疆涓涓暟鎹柇鐐廣傚涓嬪浘錛?span lang="EN-US"> ![]()
Figure 2 鏁版嵁鏂偣
F5緇х畫榪愯錛岀▼搴忓仠鍦?span lang="EN-US">B琛岋紝璇存槑B澶勪唬鐮佷慨鏀逛簡szName1銆?span lang="EN-US">B澶勬槑鏄庢病鏈変慨鏀?span lang="EN-US">szName1鍛錛熶絾璋冭瘯鍣ㄦ寚鏄庢槸榪欎竴琛岋紝涓鑸笉浼?xì)閿欏Q屾墍浠ヨ繕鏄潤涓嬪績鏉ョ湅鐪嬬▼搴忥紝鍝︼紝浣犲彂鐜頒簡錛?span lang="EN-US">szName2鍙湁4涓瓧鑺傦紝鑰?span lang="EN-US">strcpy浜?span lang="EN-US">7涓瓧鑺傦紝鎵浠ヨ鍐欎簡szName1銆?span lang="EN-US">
鏁版嵁鏂偣涓嶅彧鏄鍙橀噺鏀瑰彉鏈夋晥錛岃繕鍙互璁劇疆鍙橀噺鏄惁絳変簬鏌愪釜鍊箋傝濡傦紝浣犲彲浠ュ皢Figure 2涓孩鍦堝鏀逛負(fù)鏉′歡鈥漵zName2[0]==''''y''''鈥?閭d箞褰?span lang="EN-US">szName2絎竴涓瓧絎︿負(fù)y鏃舵柇鐐瑰氨浼?xì)鍚姩銆?span lang="EN-US">
鍙互鐪嬪嚭錛屾暟鎹柇鐐圭浉瀵逛綅緗柇鐐逛竴涓緢澶х殑鍖哄埆鏄笉鐢ㄦ槑紜寚鏄庡湪鍝竴琛屼唬鐮佽緗柇鐐廣?span lang="EN-US">
涓?鍏朵粬
1 鍦?span lang="EN-US">call stack紿楀彛涓緗柇鐐癸紝閫夋嫨鏌愪釜鍑芥暟錛屾寜F9璁劇疆涓涓柇鐐廣傝繖鏍峰彲浠ヤ粠娣卞眰嬈$殑鍑芥暟璋冪敤涓繀閫熻繑鍥炲埌闇瑕佺殑鍑芥暟銆?span lang="EN-US">
2 Set Next StateMent鍛戒護錛?span lang="EN-US">debug榪囩▼涓紝鍙抽敭鑿滃崟涓殑鍛戒護錛?span lang="EN-US">
姝ゅ懡浠ょ殑浣滅敤鏄皢紼嬪簭鐨勬寚浠ゆ寚閽堬紙EIP錛夋寚鍚戜笉鍚岀殑浠g爜琛屻傝濡傦紝浣犳鍦ㄨ皟璇曚笂闈㈤偅孌典唬鐮侊紝榪愯鍦?span lang="EN-US">A琛岋紝浣嗕綘涓嶆効鎰忚繍琛?span lang="EN-US">B琛屽拰C琛屼唬鐮侊紝榪欐椂錛屼綘灝卞彲浠ュ湪D琛岋紝鍙抽敭錛岀劧鍚?span lang="EN-US">鈥淪et Next StateMent鈥?/span>銆傝皟璇曞櫒灝變笉浼?xì)鎵ц?span lang="EN-US">B銆?span lang="EN-US">C琛屻傚彧瑕佸湪鍚屼竴鍑芥暟鍐咃紝姝ゆ寚浠ゅ氨鍙互闅忔剰璺沖墠鎴栬煩鍚庢墽琛屻傜伒媧諱嬌鐢ㄦ鍔熻兘鍙互澶ч噺鑺傜渷璋冭瘯鏃墮棿銆?span lang="EN-US">
3 watch紿楀彛
watch紿楀彛鏀寔涓板瘜鐨勬暟鎹牸寮忓寲鍔熻兘銆傚杈撳叆0x65,u錛屽垯鍦ㄥ彸鏍忔樉紺?span lang="EN-US">101銆?span lang="EN-US">
瀹炴椂鏄劇ずwindows API璋冪敤鐨勯敊璇細(xì)鍦ㄥ乏鏍忚緭鍏?span lang="EN-US">@err,hr銆?span lang="EN-US">
鍦?span lang="EN-US">watch紿楀彛涓皟鐢ㄥ嚱鏁般傛彁閱掍竴涓嬶紝璋冪敤瀹屽嚱鏁板悗椹笂鍦?span lang="EN-US">watch紿楀彛涓竻闄ゅ畠錛屽惁鍒欙紝鍗曟璋冭瘯鏃舵瘡涓姝ヨ皟璇曞櫒閮戒細(xì)璋冪敤姝ゅ嚱鏁般?span lang="EN-US">
4 messages鏂偣涓嶆庝箞瀹炵敤銆傚熀鏈笂鍙互鐢ㄥ墠闈㈣榪扮殑鏂偣浠f浛銆?span lang="EN-US">
鎬葷粨
璋冭瘯鏈閲嶈鐨勮繕鏄綘瑕佹濊冿紝瑕佺寽嫻嬩綘鐨勭▼搴忓彲鑳藉嚭閿欑殑鍦版柟錛岀劧鍚庤繍鐢ㄤ綘鐨勮皟璇曞櫒鏉ヨ瘉瀹炰綘鐨勭寽嫻嬨傝岀啛緇冧嬌鐢ㄤ笂闈㈣繖浜涙妧宸ф棤鐤戜細(xì)鍔犲揩榪欎釜榪囩▼銆傛渶鍚庯紝澶у濡傛灉鏈夊叧浜庤皟璇曟柟闈㈢殑闂錛屾垜涔愭剰鍙備笌鎺㈣
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
閿腑鐨勫唴瀹規(guī)潵瀵規(guī)湭澶勭悊鐨勫紓甯擱噰鍙栦竴縐嶇粺涓鐨勮涓哄拰鏂規(guī)硶銆?span lang=EN-US>
璇ラ敭涓殑
Auto: 鍐沖畾鏄嚜鍔ㄨ繍琛岃皟璇曞櫒錛岃繕鏄鐢ㄦ埛鍐沖畾
Debugger: 鏄寚鍚戣皟璇曞櫒鍙墽琛屾枃浠剁殑璺緞鐨勫瓧絎︿覆
-------------------------------------------------------------------------------------------
鎹瀵燂紝鍦ㄦ垜瑁呬簡vs2005涔嬪悗
"Auto"="1"
"Debugger"="\"C:\\WINDOWS\\system32\\vsjitdebugger.exe\" -p %ld -e %ld"
琛ㄧず灝嗚嚜鍔ㄨ繍琛岃皟璇曞櫒
-------------------------------------------------------------------------------------------
鑰?span lang=EN-US>Windows榛樿鐨勮皟璇曞櫒鏄?span lang=EN-US>Dr.Watson
瀹冩崟鑾峰簲鐢ㄧ▼搴忓簲鐢ㄧ▼搴忓穿婧冪姸鎬侊紝騫惰褰曟棩蹇楁枃浠訛紙Drwtsn32.log錛夊拰榪涚▼宕╂簝杞偍鏂囦歡錛?span lang=EN-US>User.dmp錛夈?span lang=EN-US>
瑕佹兂鏌ョ湅騫墮厤緗?span lang=EN-US>Dr.Watson錛屽彲浠ュ湪榪愯涓緭鍏?span lang=EN-US>Drwtsn32.exe銆?span lang=EN-US>
瑕佹兂鎭㈠緋葷粺鍒濆鐘舵佸垯鍙互榪愯 Drwtsn32 -i
榪欐牱娉ㄥ唽琛ㄧ殑閭d袱涓間細(xì)鍙樻垚
"Auto"="1"
"Debugger"="drwtsn32 -p %ld -e %ld -g"
-------------------------------------------------------------------------------------------
3銆佸彂鐢熷紓甯哥殑鏃跺欎負(fù)浜嗕繚鐣欑幇鍦哄爢鏍堥渶瑕佸喕緇撹繘紼嬪唴鍏朵粬綰跨▼錛屾墍浣跨敤鐨勬搷浣滆秺灝戣秺濂姐?span lang=EN-US>
4銆佸紑鍚彟澶栦竴涓繘紼嬪寮傚父榪涚▼榪涜MiniDump銆?span lang=EN-US>
5銆佸鏋滆鍒嗘瀽宕╂簝鍦板潃鏄惁鍦ㄦ煇涓ā鍧楋紝鏈濂藉湪鍒嗘瀽榪涚▼閲屽仛銆傛垨鑰呭湪妯″潡鍔犺澆鏃惰綆楁ā鍧楀尯鍩熶互渚垮湪寮傚父鏃跺揩閫熷畾浣嶃傚垽鏂穿婧冩槸鍚﹀拰鏌愪釜妯″潡鐩稿叧錛屽彧鑳介氳繃鍒嗘瀽鍫嗘爤閲岀殑妯″潡鏉ヨ瘑鍒紝浣跨敤StackWalk鍑芥暟銆?span lang=EN-US>StackWalk鍑芥暟閲屾墍浣跨敤鐨?span lang=EN-US>context鍙傛暟瑕佷嬌鐢ㄥ紓甯稿弬鏁伴噷鐨?span lang=EN-US>ContextRecord錛岃繖鏍瘋兘鍒嗘瀽鍦ㄥ穿婧冪殑鏃跺欑殑鍫嗘爤錛岃屼笉浼?xì)鍙楀悗闈㈡搷浣滅殑濯勫搷銆?span lang=EN-US>
6銆佸鏋滃笇鏈涜嚜宸辨槸絎竴涓璋冪敤錛屽彲浠ュ湪鎸傞摼涔嬪悗鐢?span lang=EN-US>APIHook璁劇疆SetUnhandledExceptionFilter榪斿洖絀恒?span lang=EN-US>
7銆佸湪鍐葷粨綰跨▼鐨勬椂鍊欙紝涓嶈鎵?span lang=EN-US>MessageBox錛屼細(xì)瀵艱嚧褰撳墠綰跨▼鍥犱負(fù)鍏朵粬綰跨▼鎸傝搗鑰岄樆姝匯?span lang=EN-US>
8銆佸紓甯擱櫎浜?span lang=EN-US>SetUnHandledExceptionFliter涔嬪錛岃繕鏈?span lang=EN-US>AddVectoredExceptionHandler錛岀浉瀵逛簬鍓嶈咃紝鍚庤呯殑浼樼偣鏄兘澶熻寮傚父鎸夌収閾懼紡瑙﹀彂錛屼笉浼?xì)琚腑闂磋妭鐐规柇寮銆備絾鏄?span lang=EN-US>AddVectoredExceptionHandler鏃犳硶鍦?span lang=EN-US>2K涓嬩嬌鐢ㄣ傘傘?span lang=EN-US>
1銆?/span> 紼嬪簭緙栬瘧閫夐」
2銆?/span> 鍒╃敤VS2005 鍒嗘瀽dump鏂囦歡
3銆?/span> 甯歌闂璁ㄨ
涓銆?/span>
紼嬪簭緙栬瘧閫夐」PDB files contains all debug information like type definition and function prototype. When application crashes, we need the PDB files to analyze the root cause, so make sure these PDB files will be created when building it. You must do the following setting:
C/C++\General\Debug Information Format=Program Database (/Zi).
鍥?/span>1.1 璋冭瘯淇℃伅鏍煎紡
Linker\Debugging\Generate Program Database File=”Name and location of your PDB files”
鍥?/span>1.2 PDB鏂囦歡杈撳嚭璺緞
PDB鏂囦歡璺緞鏈濂借緗湪鍚屼竴涓枃浠跺す涓紝榪欐牱鏂逛究dmp鏂囦歡璋冭瘯鏃惰皟鐢ㄣ?/span>
璋冭瘯鏃訛紝鎵鏈夌殑PDB鏂囦歡鍜屾簮鏂囦歡蹇呴』涓ユ牸鍖歸厤錛?/span>the PDB files should be the one generated by build the source code錛夛紝騫跺瓨鍌ㄥ湪涓涓畨鍏ㄧ殑浣嶇疆銆傚綋瀹㈡埛鎶ュ憡浜嗕竴涓敊璇椂錛屼綘闇瑕佽繖浜涙枃浠舵潵甯繖浠ヤ究瀹氫綅閿欒浜庢簮浠g爜涓茍瑙e喅闂銆?/span>
浜屻?/span>
VS2005 鍒嗘瀽dump鏂囦歡In this simple application, there is an unhandled Access Violation Reading exception, because GetNameFromDatabase returns a NULL pointer, and this pointer is passed into IsPrefix and then it’s used directly without NULL pointer checking.
鍥?/span>1.3 婕旂ず浠g爜
鍒╃敤Release妯″紡緙栬瘧璇ユ祴璇曠▼搴忥紝鍦ㄥ鎴鋒満涓婅繍琛岃紼嬪簭錛屽皢鏍規(guī)嵁NTSD璁劇疆鐢熸垚鐩稿搴旂殑DMP鏍煎紡鏂囦歡銆?/span>
鍙互浣跨敤Visual Studio.Net銆?/span>NTSD鎴栨槸鍏朵粬鐨勮皟璇曞伐鍏峰DMP鏍煎紡鏂囦歡榪涜鍒嗘瀽銆?/span>
l Start Visual Studio.Net
Click File\Open Solution and make sure the files of type is *.dmp then click Open.
鍥?/span>1.3 Open Dump File (GUI)
l Set Symbol Path
Click Tools\Options, Debugging\Symbols錛屽鍔?/span>PDB鏂囦歡璺緞銆傝嫢璋冭瘯鐨勭▼搴忛渶瑕佸井杞熀紜搴撶殑PDB淇℃伅錛屽彲浠ュ鍔犱竴涓礬寰勪負(fù)錛?/span>
http://msdl.microsoft.com/download/symbols
鍦ㄧ晫闈笅鏂?/span>Cache Symbol From symbol…閫夋嫨鏈湴瀛樺偍榪欎簺Symbols鐨勮礬寰勩?/span>
鍥?/span>1.4 Symbol Path
濡傛灉DMP鏂囦歡娌℃湁鏀懼叆鏈韓PDB鏂囦歡鎵鍦ㄧ洰褰曪紝涔熷彲浠ュ湪姝ゅ澧炲姞涓涓湰鍦扮洰褰曘傜偣OK鍚庯紝VS2005灝嗕粠緗戠粶涓笅杞芥墍闇瑕佺殑Symbols錛岄渶瑕佺瓑寰呬竴孌墊椂闂淬傚鏋滄槸澶氭璋冭瘯鍚屼竴涓▼搴忛敊璇墍鐢熸垚鐨?/span>DMP鏂囦歡錛屽彲浠ュ湪瀵硅瘽妗嗕腑閫夋嫨“Search the above locations only when symbols are loaded manually”銆備粠鑰屽彲浠ヨ妭鐪佺綉緇滃甫瀹姐?/span>
l Set Source code path
Open Solution Property Pages and set the source code path.
鍥?/span>1.5 灞炴ц彍鍗?/span>
鍥?/span>1.6 Debug Source Files
l Start to Debug the Dump File
Click the Debug menu, it will ask you to save as a solution, save it. Then it will go to the line which caused the crash of your application.
鍥?/span>1.7 璋冭瘯紿楀彛錛屽畾浣嶅埌婧愪唬鐮?/span>
涓夈?/span>
甯歌闂璁ㄨ1銆?/span> Dump鏂囦歡鏀懼湪鍝噷錛?/span>
Dump鏂囦歡涓嶇敤闈炶鏀懼湪浣犵紪璇戝嚭鏉ョ殑浣嶇疆錛屼綘瀹屽叏鍙互寤虹珛涓涓柊鐨勬枃浠跺す鏉ユ斁瀹冦備絾鑻ヤ笉鏄瓨鏀懼湪緙栬瘧鍑烘潵鐨勪綅緗紝闇瑕佸皢緙栬瘧鐢熸垚鐨?/span>PDB鏂囦歡鎷瘋礉鍒?/span>Dump鏂囦歡鐩綍錛屾垨鏄埄鐢?/span>VS2005鎵撳紑Dump鏂囦歡鍚庯紝璁劇疆PDB鏂囦歡璺緞銆傚弬鐓у浘1.4銆?/span>
2銆?/span> 濡備綍鎭㈠褰撴椂鐨勭幇鍦猴紵
鍙兘浣犺闂紝鎬庝箞鍙兘錛岃繖涓?span lang=EN-US>dump鏂囦歡鍙槸鐢ㄦ埛鍙戠粰鎴戠殑錛屾垜涓嶅彲鑳藉幓鐢ㄦ埛瀹墮噷璋冭瘯鍚э紵榪欎釜鎭㈠鐜板満鍙笉鏄寚鐨勯潪瑕佸埌閭e彴鏈哄櫒涓婂幓錛岃屾槸瑕佹妸浜х敓dump鏂囦歡瀵瑰簲鐨勪簩榪涘埗鏂囦歡鎷垮埌銆?span lang=EN-US>
浣嗘槸鎭㈠鐜板満闇瑕佹墍鏈夌殑浜岃繘鍒舵枃浠墮兘瑕佸搴旓紝浣犱竴瀹氳鏈夊鑷寸敤鎴峰穿婧冪殑閭d簺Exe鍜?span lang=EN-US>DLL銆傛棦鐒舵槸浣犲彂甯冪殑紼嬪簭錛?span lang=EN-US>Exe鏂囦歡褰撶劧浣犱細(xì)鏈夈傛墍浠ヨ繖閲屽彧鑰冭檻DLL灝辮浜嗐?span lang=EN-US>
Dump鏂囦歡涓褰曚簡鎵鏈?span lang=EN-US>DLL鏂囦歡鐨勭増鏈彿鍜屾椂闂存埑錛屾墍浠ヤ綘涓瀹氬彲浠ュ悓榪囨煇縐嶉斿緞鎷垮埌瀹冦傚鏋滀綘鑳戒粠鐢ㄦ埛閭i噷鎷垮埌鏈濂斤紝濡傛灉涓嶆柟渚匡紝鐢ㄦ埛涓嶅彲鑳界敤鐨勬槸鎴戜滑騫沖父涓嶅父鐢ㄧ殑鎿嶄綔緋葷粺錛屾墍浠ユ壘涓湁瀵瑰簲緋葷粺鐨勬満鍣ㄤ竴鑸兘浼?xì)鏈夈備絾鏄浣忎笉浠呮槸鏂囦歡鍚嶇О瑕佷竴鑷達(dá)紝榪樿鏍稿鐗堟湰鍜屾椂闂存埑錛屽鏋滀笉鍚屼竴鏍鋒病鏈夊姙娉曠敤銆?span lang=EN-US>
濡傛灉瀹㈡埛鐢ㄤ簡鏌愪釜鐗規(guī)畩鐨勮ˉ涓佹庝箞鍔烇紵
鍏跺疄榪欎釜闂涔熷緢濂借В鍐籌紝鍙瀹冧笉闃葷闃呰鍫嗘爤錛屽氨涓嶇敤綆″畠錛岃皟璇?span lang=EN-US>Dump鍜岃繍琛岀▼搴忎笉涓鏍鳳紝緙哄皯涓涓や釜DLL娌℃湁浠諱綍闂銆?span lang=EN-US>
3銆?/span> 濡傛灉鐪熺殑闇瑕佹庝箞鍔烇紵
絎﹀彿鏂囦歡鐜板湪涓昏鏄寚PDB鏂囦歡銆?span lang=EN-US>
濡傛灉娌℃湁絎﹀彿鏂囦歡錛岄偅涔堣皟璇曠殑鏃跺欏彲鑳藉鑷村爢鏍堥敊璇?span lang=EN-US>
濡傛灉浣犱涪澶變簡榪欎釜鍙戝竷鐗堟湰涓綘緙栬瘧鍑烘潵鐨勯偅浜?/span>exe鍜?/span>DLL鐨?/span>PDB錛岄偅涔堣繖涓崯澶辨槸涓ラ噸鐨勶紝閲嶆柊緙栬瘧鍑烘潵鐨勭増鏈槸涓嶈兘浣跨敤鐨勩?/span>
鎴戣嚜宸辯殑DLL閮芥湁浜嗭紝鍙槸緙虹殑鏄郴緇熺殑DLL鐨勫搴?/span>PDB鏂囦歡鎬庝箞鍔烇紵鍥?/span>1.4涓凡緇忎粙緇嶄簡鏂規(guī)硶銆傚井杞湪瀹冪殑絎﹀彿鏁版嵁搴撲笂涓烘垜浠彁渚涗簡鎵鏈夌殑PDB鏂囦歡錛岃繕鏈夐儴鍒嗛潪鍏抽敭DLL銆傝緗ソ鍚庣▼搴忓皢鑷姩涓嬭澆闇瑕佺殑PDB鍙?/span>DLL鏂囦歡銆?/span>
4銆?/span> 鎷垮埌闇瑕佺殑鏂囦歡浜嗭紝榪欎簺鏂囦歡搴旇鏀懼湪鍝噷錛?/span>
絎﹀彿鏁版嵁搴撲腑鐨勬枃浠朵笉鐢ㄥ姩錛屾妸鍏跺畠鐨?/span>exe鍜?/span>DLL銆?/span>PDB鏂囦歡鏀懼湪dump鏂囦歡鐩綍閲屽氨琛屼簡銆?/span>
5銆?/span> 鎴戠敤鐨勬槸VS2005錛屾槑鏄庢湁婧愪唬鐮侊紝涓轟粈涔堟樉紺轟笉浜嗭紵
榪欎釜鏄?/span>dump璋冭瘯鐨勬渶澶寸棝闂錛屼唬鐮佸彲鑳藉凡緇忔敼榪囦簡錛屽嵆浣夸綘浠?/span>SVN鎷垮埌褰撴椂鐨勭増鏈紝鏃墮棿鎴充篃鏄敊鐨勶紝VS2005灝辨槸涓嶈浣犳樉紺轟唬鐮併傚叾瀹炲彧瑕佸湪
Tools\Options錛?/span>Debugging\General涓幓鎺?/span>
Require source files to exactly match the original version鐨勫閫夊氨琛屼簡銆?/span>
鍓嶈█錛氫箣鍓嶄粙緇嶄簡鍒╃敤VS2005榪涜Dump鏂囦歡鐨勮皟璇曪紝鍔熻兘闈炲父寮哄ぇ銆備絾VS2005鏄竴涓ぇ紼嬪簭錛屾湰鏂囧皢璁ㄨ鍒╃敤NTSD鐨?span lang=EN-US>Command Line 瀹炵幇Dump 鏂囦歡鐨勮皟璇曘?span lang=EN-US>
1銆?/span> 杞藉叆DMP鏍煎紡鏂囦歡
鍒╃敤CMD鎵撳紑鍛戒護琛岀獥鍙o紝鍒囨崲鍒?span lang=EN-US>NTSD鎵鍦ㄧ洰褰曘傚埄鐢ㄥ懡浠よ澆鍏?span lang=EN-US>DMP鏂囦歡錛?span lang=EN-US>
ntsd –z dumpfileName –y symbolPath –srcpath sourcecodePath
dumpfileName錛?span lang=EN-US>DMP鏍煎紡鏂囦歡璺緞
symbolPath錛?span lang=EN-US>PDB鏂囦歡璺緞
sourcecodePath錛氱▼搴忕殑婧愪唬鐮佽礬寰?span lang=EN-US>
濡傚浘1.1錛岃嫢杞藉叆鎴愬姛錛屽皢寮瑰嚭涓涓?span lang=EN-US>NTSD紿楀彛錛屽鍥?span lang=EN-US>1.2銆?span lang=EN-US>
鍥?span lang=EN-US>1.1 杞藉叆DMP鏍煎紡鏂囦歡
鍥?span lang=EN-US>1.2 NTSD鐣岄潰
綰㈣壊鐨勫湀涓樉紺轟簡BUG鐨勫師鍥狅紝鍑芥暟IsPrefix 瀛樺湪閿欒銆?/span>0x36鏄敊璇浉瀵逛簬鍑芥暟鐨勫亸縐誨箋傝繖涓敊璇槸涓涓?span lang=EN-GB>Access Violation鐨勫紓甯革紝寮傚父鍦板潃涓?span lang=EN-GB>00401036銆?/span>
Note錛?/span>
l 鑻ヨ礬寰勪腑瀛樺湪絀烘牸錛岄渶瑕佺敤鍦ㄨ礬寰勫墠鍚庡姞涓婂紩鍙楓?/span>
l 鑻ユ彁紺洪敊璇紝鏍規(guī)嵁鎻愮ず鏌ョ湅鏄惁鐢變簬dbghelp.dll涓嶅瓨鍦ㄥ鑷達(dá)紝瀹夎鐨勮皟璇曞伐鍏峰寘涓瓨鍦ㄨ鍔ㄦ佸簱銆?/span>
2銆?/span> 瀹氫綅涓庢簮浠g爜
鍒╃敤濡備笅鍛戒護鍙互瀹氫綅閿欒鍒版簮浠g爜涓細(xì)
lsp –a 500
lsa .
絎竴琛屽懡浠ょ敤浜庤緗樉紺虹殑婧愪唬鐮佽鏁幫紝絎簩琛屽懡浠ゅ皢閿欒瀹氫綅涓庨敊璇銆傚鍥撅細(xì)
鍥?span lang=EN-US>1.3 Analysis Result: Line of Source Code Causing Crash
浠庡浘涓彲浠ョ湅鍑猴紝絎?span lang=EN-US>13鍙鋒槸瀵艱嚧紼嬪簭閿欒鐨勪綅緗傚鏋滃笇鏈涚湅鍒板彉閲忕殑鍊鹼紝浣跨敤鍛戒護錛?span lang=EN-US>
x
鑻ラ渶瑕佽緇嗘煡鐪嬫煇涓彉閲忕殑鍊鹼紝浣跨敤鍛戒護錛?span lang=EN-US>
?? variableName
鍥?/span>1.4 Analysis Result: Value of Variable Causing Crash
Module Address of Your Application(鏄劇ず紼嬪簭妯″潡鍦板潃)
Command:
x *!
鍥?span lang=EN-GB>1.5 Application Module Information
It shows all the module address in your application.
Crash Stack Trace錛堟樉紺虹▼搴忚皟鐢ㄥ爢鏍堬級
If you want to trace the stack of application, use this command:
Command:
kb
鍥?span lang=EN-GB>1.6 Application Stack Trace
It shows that function main invokes function IsPrefix then application crashes.
For more commands of NTSD, refer to debugger.chm in Microsoft Debugger Tools package.
1銆?/span> 鎵撳紑Dump鏍煎紡鏂囦歡
鎵撳紑WinDbg錛岄氳繃鑿滃崟[File] à [Open Crash dump] 閫夋嫨dump鏂囦歡鎵撳紑錛屼篃鍙氳繃CMD鎵撳紑Dos鍛戒護紿楀彛錛屽垏鎹㈠埌WinDbg鎵鍦ㄧ洰褰曪紝鍒╃敤鍛戒護錛?span lang=EN-US>
WinDbg –z “D:\Lines
-z琛ㄧず璺緞
鍥?span lang=EN-US>1.1 鍒╃敤WinDbg鎵撳紑dump鏂囦歡
杞藉叆dump鏂囦歡鏄劇ず濡傚浘錛?span lang=EN-US>
鍥?span lang=EN-US>1.2 WinDbg鐣岄潰
2銆?/span> 鍒嗘瀽dump鏂囦歡
鑻ョ敓鎴愮殑dump鏂囦歡鍦ㄦ湰鏈猴紝dump鏂囦歡涓皢鍖呭惈璋冭瘯闇瑕佺殑PDB鏂囦歡鍙婃簮浠g爜璺緞錛岃嫢涓嶅湪鏈満錛屽彲浠ラ氳繃WinDbg鑿滃崟[File] à [Symbol File path] 鍙?[Source File Path] 鍒嗗埆璁劇疆PDB鏂囦歡璺緞鍜屾簮浠g爜璺緞銆傚鏋滅▼搴忔秹鍙婂埌DLL錛岄渶瑕佸皢EXE銆?span lang=EN-US>DLL鎵鏈夋秹鍙婄殑PDB銆佹簮浠g爜璺緞閮藉寘鎷備嬌鐢ㄥ懡浠わ細(xì)
!analyze –v
灝嗗垎鏋?span lang=EN-US>dump鏂囦歡錛屽茍鏄劇ず紼嬪簭宕╂簝澶勪簬鐨勪唬鐮佽錛?span lang=EN-US>
鍥?span lang=EN-US>1.3 鍒嗘瀽dump 鏂囦歡
濡傛灉浣犵殑紼嬪簭浠涔堥兘涓嶅共. 閭d箞鍦ㄧ▼搴忓嚭閿欑殑鏃跺?span lang=EN-US>. drwtsn32.exe 浼?xì)鍐欎竴涓?span lang=EN-US> userdump. 浣?span lang=EN-US> drwtsn32 鏈変簺緙虹偣. 姣斿鍙兘鍐欎竴涓?span lang=EN-US> dump 鏂囦歡. 鍚庨潰鐨勫穿婧冨啓 dump 鏂囦歡鏃朵細(xì)瑕嗙洊鍓嶉潰鐨?span lang=EN-US>. win2000 涓嬬殑 drwtsn32 鍙兘鍐欐棫寮忕殑 dump 鏂囦歡(寰寰灝哄姣旇緝澶?span lang=EN-US>). 鏈変竴綃囨枃绔犺榪扮殑姣旇緝娓呮:
http://www.debuginfo.com/articles/ntsdwatson.html
寤鴻浣跨敤 ntsd 浠f浛 drwtsn32. 浣?span lang=EN-US> ntsd 鐨勭己鐐瑰氨鏄渶瑕佸畨瑁呮渶鏂扮殑 windbg. 榪欐槸涓涓‖浼?span lang=EN-US>. 鍦ㄧ湅浜?span lang=EN-US> debuginfo.com 鐨勫彟涓綃囨枃绔?span lang=EN-US>:
http://www.debuginfo.com/articles/effminidumps.html
涔嬪悗, 鎴戦夋嫨鐨勬槸鍦ㄧ▼搴忓嚭閿欑殑鏃跺欒皟鐢?span lang=EN-US> api 鑷繁鍐?span lang=EN-US> minidump. 鍏嬫湇浜?span lang=EN-US> drwtsn32, ntsd 鐨勭己鐐?span lang=EN-US>.
灝嗗皝瑁呭ソ鐨勫嚱鏁版斁鍒頒簡涓涓ご鏂囦歡涓?span lang=EN-US>, 鍖呭惈鍗沖彲. 浣跨敤鐨勬柟娉曞緢綆鍗?span lang=EN-US>:
#include <windows.h>
#include "minidump.h"
LONG __stdcall MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
CreateMiniDump(pExceptionInfo, "c:\\user.dmp");
return EXCEPTION_EXECUTE_HANDLER;
}
void main()
{
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
*(int*)0=0; // AV
}
榪欐牱灝卞ソ浜?span lang=EN-US>. 娉ㄦ剰瀹夎鑷沖皯 xp 浠ヤ笂鐨?span lang=EN-US> sdk.
榪欓噷鐢ㄥ埌浜嗕竴涓?span lang=EN-US> api SetUnhandledExceptionFilter(), 濡傛灉涓嶆槑鐧藉彲浠ユ悳涓涓?span lang=EN-US> msdn.
榪愯渚嬪瓙紼嬪簭鍑洪敊閫鍑轟箣鍚?span lang=EN-US>, 灝卞緱鍒頒簡 c:\\user.dmp. 鍙互鐢?span lang=EN-US> windbg 絳夎皟璇曞櫒鏉ュ垎鏋愪簡.
浠g爜浠庤繖閲屼笅杞?http://nicoster.googlepages.com/minidump.rar
錛?span lang=EN-US>1錛?/span> 璋冪敤abort鍑芥暟錛屽茍涓旇緗簡_CALL_REPORTFAULT閫夐」錛堣繖涓夐」鍦?span lang=EN-US>Release鐗堟湰鏄粯璁よ緗殑錛夈?span lang=EN-US>
錛?span lang=EN-US>2錛?/span> 鍚敤浜嗚繍琛屾椂瀹夊叏媯鏌ラ夐」錛屽茍涓斿湪杞歡榪愯鏃舵鏌ュ嚭瀹夊叏鎬ч敊璇紝渚嬪鍑虹幇緙撳瓨婧㈠嚭銆傦紙瀹夊叏媯鏌ラ夐」 /GS 榛樿涔熸槸鎵撳紑鐨勶級
錛?span lang=EN-US>3錛?/span> 閬囧埌_invalid_parameter閿欒錛岃屽簲鐢ㄧ▼搴忓張娌℃湁涓誨姩璋冪敤
_set_invalid_parameter_handler璁劇疆閿欒鎹曡幏鍑芥暟銆?span lang=EN-US>
鎵浠ョ粨璁烘槸錛屼嬌鐢?span lang=EN-US>VS2005錛?span lang=EN-US>VC8錛夌紪璇戠殑紼嬪簭錛岃澶氶敊璇兘涓嶈兘鍦?span lang=EN-US>SetUnhandledExceptionFilter鎹曡幏鍒般傝繖鏄?span lang=EN-US>CRT鐩稿浜庡墠闈㈢増鏈殑涓涓瘮杈冨ぇ鐨勬敼鍙橈紝浣嗘槸寰堥仐鎲撅紝Microsoft鍗存病鏈夊湪鐩稿簲鐨勬枃妗f槑紜寚鍑恒?span lang=EN-US>
瑙e喅鏂規(guī)硶
涔嬫墍浠ュ簲鐢ㄧ▼搴忔崟鑾蜂笉鍒伴偅浜涘紓甯革紝鍘熷洜鏄洜涓烘柊鐗堟湰鐨?span lang=EN-US>CRT瀹炵幇鍦ㄥ紓甯稿鐞嗕腑寮哄埗鍒犻櫎鎵鏈夊簲鐢ㄧ▼搴忓厛鍓嶈緗殑鎹曡幏鍑芥暟錛屽涓嬫墍紺猴細(xì)
/* Make sure any filter already in place is deleted. */
SetUnhandledExceptionFilter(NULL);
UnhandledExceptionFilter(&ExceptionPointers);
瑙e喅鏂規(guī)硶鏄嫤鎴?span lang=EN-US>CRT璋冪敤SetUnhandledExceptionFilter鍑芥暟錛屼嬌涔嬫棤鏁堛傚湪X86騫沖彴涓嬶紝鍙互浣跨敤浠ヤ笅浠g爜銆?span lang=EN-US>
#ifndef _M_IX86
#error "The following code only works for x86!"
#endif
void DisableSetUnhandledExceptionFilter()
{
void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),
"SetUnhandledExceptionFilter");
if (addr)
{
unsigned char code[16];
int size = 0;
code[size++] = 0x33;
code[size++] = 0xC0;
code[size++] = 0xC2;
code[size++] = 0x04;
code[size++] = 0x00;
DWORD dwOldFlag, dwTempFlag;
VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);
}
}
鍦ㄨ緗嚜宸辯殑寮傚父澶勭悊鍑芥暟鍚庯紝璋冪敤DisableSetUnhandledExceptionFilter紱佹CRT璁劇疆鍗沖彲銆?span lang=EN-US>
鍏跺畠璁ㄨ
涓婇潰閫氳繃璁劇疆api hook錛岃В鍐充簡鍦?span lang=EN-US>VS2005涓婄殑寮傚父鎹曡幏闂錛岃繖縐嶈櫧鐒朵笉鏄偅涔?#8220;騫插噣”鐨勮В鍐蟲柟妗堬紝紜槸鐩墠鍞竴綆鍗曟湁鏁堢殑鏂瑰紡銆?span lang=EN-US>
铏界劧涔熷彲浠ラ氳繃_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), 鍜?span lang=EN-US>_set_invalid_parameter_handler(...) 瑙e喅錛?span lang=EN-US>1錛夛紙3錛夛紝浣嗘槸瀵逛簬錛?span lang=EN-US>2錛夛紝璁劇疆api hook鏄敮涓鐨勬柟寮忋?span lang=EN-US>