VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项
一、minidump文件
二、pdb文件
后續加入!
三、注意事項
1、 exe文件、dmp文件和pdb文件必須保持一致!
在上篇博客中,我們簡單的介紹了如何用dmp文件和pdb文件定位代碼中崩潰位置。鏈接如下:
http://blog.csdn.net/itworld123/article/details/79041500
上述能夠成功定位的一個前提是exe文件、dmp文件和pdb文件都是同時生成的,即:exe文件和pdb文件同時生成,dmp文件是由當前exe生成的。若生成崩潰信息之后,又重新編譯了exe,與此同時也重新生成了pdb文件,那么即使代碼沒有任何改動,此時WinDbg也沒有辦法進行代碼行號定位了,顯示的信息如下:
上述信息大家可以看到,定位源碼的功能已經消失了。
2、關閉代碼優化功能。
#include "stdafx.h" #include <windows.h>#include <DbgHelp.h> #pragma comment(lib,"Dbghelp.lib")static long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp);void ErrorFun(int *p) {p[2] = 10; //這里崩潰 }int _tmain(int argc, _TCHAR* argv[]) {::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);int *pi = NULL; ErrorFun(pi); return 0; }long __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp) {HANDLE hDumpFile = ::CreateFile(L"MEMORY.DMP",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);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);}::CloseHandle(hDumpFile);return 0; }上述代碼在沒有關閉代碼優化功能的情況下,按照上篇博客的方法,生成的信息如下:
WRITE_ADDRESS: 00000008 FOLLOWUP_IP: TEST11!wmain+b [d:\huawei\projects\test11\test11\test11.cpp @ 22] 013e100b c705080000000a000000 mov dword ptr ds:[8],0AhMOD_LIST: <ANALYSIS/>FAULTING_THREAD: 00000814BUGCHECK_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 013e120c to 013e100bSTACK_TEXT: 0038f9cc 013e120c 00000001 00032888 00033a40 TEST11!wmain+0xb [d:\huawei\projects\test11\test11\test11.cpp @ 22] 0038fa10 746b336a 7efde000 0038fa5c 77139902 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. 0038fa1c 77139902 7efde000 775e96bf 00000000 kernel32!BaseThreadInitThunk+0x12 0038fa5c 771398d5 013e132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63 0038fa74 00000000 013e132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND: ~0s; .ecxr ; kbFAULTING_SOURCE_CODE: 18: int _tmain(int argc, _TCHAR* argv[])19: {20: ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);21: int *pi = NULL; > 22: ErrorFun(pi); 23: return 0;24: }25: 26: long __stdcall CrashInfocallback( _EXCEPTION_POINTERS *pexcp)27: {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/5a58a3c4/TEST11_exe/0_0_0_0/5a58a3c4/c0000005/0000100b.htm?Retriage=1Followup: MachineOwner大家可以發現,WinDbg確實定位到了源碼位置,但是僅僅是函數外面,沒有進去。
后來上網查了很多資料,最后隱約感覺到可能是Release代碼優化的原因,所以當我關閉代碼優化的時候,成功地定位到了真正的位置。信息如下:
拓展:VS2010關閉代碼優化的方法:
項目 -> 工程名 + 屬性
彈出如下圖所示的框:
對“優化”選擇“已禁用”,默認為“使速度最大化”,確定之后,重新編譯程序即可。
四、總結
解釋:exe文件和pdb文件同時生成,dmp文件是由當前exe生成的。
五、源碼
http://download.csdn.net/download/itworld123/10203098
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs2010 利用DMP文件、pdb文件
- 下一篇: C中标识符和关键字