vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法
生活随笔
收集整理的這篇文章主要介紹了
vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2018-01-12 創(chuàng)建人:Ruo_Xiao
開發(fā)環(huán)境:Windows7,VS2010,WinDbg 6.12。
選擇 項(xiàng)目 -> 工程名+屬性,如下圖所示。
2. 進(jìn)去 之后選擇 配置屬性 -> 連接器 -> 調(diào)試,如下圖所示。
右面選項(xiàng)如下圖所示:
上圖中,“生成調(diào)試信息”為pdb文件生成與否的使能開關(guān),“生成程序數(shù)據(jù)庫文件”為該pdb文件的名字,默認(rèn)即可。
利用資源管理器生成,即:程序崩潰之后會(huì)彈出“程序已停止運(yùn)行對(duì)話框”,如下圖所示:
此時(shí)在資源管理器“進(jìn)程頁”中找到該程序,右擊,彈出的下拉菜單中找到“創(chuàng)建轉(zhuǎn)出文件”選項(xiàng),單擊即可生成,不過該文件會(huì)生成在系統(tǒng)目錄,人工找到即可。 利用API在指定目錄下生成,代碼如上所示。
(1)SetUnhandledExceptionFilter
調(diào)用時(shí)機(jī):當(dāng)異常發(fā)生時(shí),且程序不處于調(diào)試模式,則首先調(diào)用該函數(shù)。
參數(shù):lpTopLevelExceptionFilter ,函數(shù)指針。
返回值:以前設(shè)置的回調(diào)函數(shù)。
(2)CreateFile
HANDLE CreateFile(LPCTSTR lpFileName, // 指向文件名的指針 DWORD dwDesiredAccess, // 訪問模式(寫 / 讀) DWORD dwShareMode, // 共享模式,0就是不共享,反之共享。LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全屬性的指針 DWORD dwCreationDisposition, // 如何創(chuàng)建 DWORD dwFlagsAndAttributes, // 文件屬性 HANDLE hTemplateFile // 用于復(fù)制文件句柄
);
執(zhí)行程序,發(fā)現(xiàn)程序崩潰,如下圖所示:
release目錄下生成了對(duì)應(yīng)的DMP文件,如下圖所示。
打開WinDbg,依次進(jìn)行下面操作:
File -> Symbol File Path -> 選擇pdb文件存放路徑。
File -> Image File Path -> 選擇exe文件存放路徑。
File -> Open Crash Dump -> 選擇DMP文件存放路徑。
最后會(huì)彈出WinDbg對(duì)崩潰文件的初步分析的結(jié)果,在下面的輸入框中輸入“!analyze -v”,意思是軟件進(jìn)行對(duì)崩潰文件進(jìn)行分析,并顯示出來,最后的結(jié)果如下所示:
PROCESS_NAME: TEST11.exeADDITIONAL_DEBUG_TEXT:
Use '!findthebuild' command to search for the target build information.
If the build information is available, run '!findthebuild -s ; .reload' to set symbol path and load symbols.FAULTING_MODULE: 75750000 kernel32DEBUG_FLR_IMAGE_TIMESTAMP: 5a5820bbMODULE_NAME: TEST11ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lxEXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lxEXCEPTION_PARAMETER1: 00000001EXCEPTION_PARAMETER2: 0000000cWRITE_ADDRESS: 0000000c FOLLOWUP_IP:
TEST11!wmain+b [d:\test11\test11\test11.cpp @ 17]
003d100b c7050c00000005000000 mov dword ptr ds:[0Ch],5MOD_LIST: <ANALYSIS/>FAULTING_THREAD: 0000265cBUGCHECK_STR: APPLICATION_FAULT_NULL_CLASS_PTR_DEREFERENCE_INVALID_POINTER_WRITE_WRONG_SYMBOLSPRIMARY_PROBLEM_CLASS: NULL_CLASS_PTR_DEREFERENCEDEFAULT_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCELAST_CONTROL_TRANSFER: from 003d1205 to 003d100bSTACK_TEXT:
0032fa40 003d1205 00000001 005f1b20 005f1b70 TEST11!wmain+0xb [d:\test11\test11\test11.cpp @ 17]
0032fa84 7576336a 7efde000 0032fad0 77d19902 TEST11!__tmainCRTStartup+0x122 [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 552]
WARNING: Stack unwind information not available. Following frames may be wrong.
0032fa90 77d19902 7efde000 767ba0cb 00000000 kernel32!BaseThreadInitThunk+0x12
0032fad0 77d198d5 003d1326 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63
0032fae8 00000000 003d1326 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND: ~0s; .ecxr ; kbFAULTING_SOURCE_CODE: 13: int _tmain(int argc, _TCHAR* argv[])14: {15: ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);16: int *pi = NULL;
> 17: pi[3] = 5;18: return 0;19: }20: 21: long __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp)22: {SYMBOL_STACK_INDEX: 0SYMBOL_NAME: test11!wmain+bFOLLOWUP_NAME: MachineOwnerIMAGE_NAME: TEST11.exeBUCKET_ID: WRONG_SYMBOLSFAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!wmainWATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a5820bb/TEST11_exe/0_0_0_0/5a5820bb/c0000005/0000100b.htm?Retriage=1Followup: MachineOwner
一、源碼
#include "stdafx.h" #include <windows.h>#include <DbgHelp.h> #pragma comment(lib,"Dbghelp.lib")static long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp);int _tmain(int argc, _TCHAR* argv[]) {::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);int *pi = NULL;pi[3] = 5; //這里崩潰return 0; }long __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp) {HANDLE hDumpFile = ::CreateFile(L"MEMORY.DMP",GENERIC_WRITE, //寫入0, //不共享NULL, //默認(rèn)安全屬性CREATE_ALWAYS, //總是創(chuàng)建FILE_ATTRIBUTE_NORMAL, //默認(rèn)屬性NULL //為NULL,則不利用其他文件擴(kuò)展屬性);if( hDumpFile != INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION dumpInfo;dumpInfo.ExceptionPointers = pexcp;dumpInfo.ThreadId = ::GetCurrentThreadId();dumpInfo.ClientPointers = TRUE;::MiniDumpWriteDump(::GetCurrentProcess(),::GetCurrentProcessId(),hDumpFile,MiniDumpNormal,&dumpInfo,NULL,NULL);}return 0; }二、VS2010生成pdb文件
2. 進(jìn)去
上圖中,“生成調(diào)試信息”為pdb文件生成與否的使能開關(guān),“生成程序數(shù)據(jù)庫文件”為該pdb文件的名字,默認(rèn)即可。
三、生成DMP文件
兩種方法:
此時(shí)在資源管理器“進(jìn)程頁”中找到該程序,右擊,彈出的下拉菜單中找到“創(chuàng)建轉(zhuǎn)出文件”選項(xiàng),單擊即可生成,不過該文件會(huì)生成在系統(tǒng)目錄,人工找到即可。
(1)SetUnhandledExceptionFilter
調(diào)用時(shí)機(jī):當(dāng)異常發(fā)生時(shí),且程序不處于調(diào)試模式,則首先調(diào)用該函數(shù)。
參數(shù):lpTopLevelExceptionFilter ,函數(shù)指針。
返回值:以前設(shè)置的回調(diào)函數(shù)。
(2)CreateFile
返回值:若成功,則返回一個(gè)句柄,若失敗,則返回INVALID_HANDLE_VALUE,即:-1。
(3)MINIDUMP_EXCEPTION_INFORMATION
作用:該結(jié)構(gòu)體包含將要通過 MiniDumpWriteDump函數(shù)寫入Minidup文件中的崩潰信息。
原型:
(4)MiniDumpWriteDump
作用:向指定的文件中寫入用戶自己的minidump信息。
原型:
四、尋找崩潰位置
File -> Symbol File Path -> 選擇pdb文件存放路徑。
File -> Image File Path -> 選擇exe文件存放路徑。
File -> Open Crash Dump -> 選擇DMP文件存放路徑。
最后會(huì)彈出WinDbg對(duì)崩潰文件的初步分析的結(jié)果,在下面的輸入框中輸入“!analyze -v”,意思是軟件進(jìn)行對(duì)崩潰文件進(jìn)行分析,并顯示出來,最后的結(jié)果如下所示:
由上述信息中
Attempt to write to address 0000000c代表寫空指針。
0032fa40 003d1205 00000001 005f1b20 005f1b70 TEST11!wmain+0xb [d:\test11\test11\test11.cpp @ 17]和13: int _tmain(int argc, _TCHAR* argv[])14: {15: ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);16: int *pi = NULL; > 17: pi[3] = 5;18: return 0;19: }20: 21: long __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp)22: {代表源碼中第17行有異常。
上述就是簡單地查找崩潰行數(shù)的方法。
五、源碼工程
http://download.csdn.net/download/itworld123/10202793
(完)
總結(jié)
以上是生活随笔為你收集整理的vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C typedef功能介绍(内附函数指针
- 下一篇: VS2010下使用dmp文件和pdb文件