日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项

發(fā)布時間:2024/10/14 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2018-01-12 創(chuàng)建人:Ruo_Xiao 2018-01-15 修改人:Ruo_Xiao 添加為dump、exe和pdb版本保持一致的原因。

一、minidump文件

  • 崩潰轉(zhuǎn)儲是創(chuàng)建一個應用程序崩潰瞬間的狀態(tài)鏡像。
  • 初代的轉(zhuǎn)儲文件是記錄了進程的虛擬空間中全部內(nèi)容,但是這樣的文件非常大,而且對于不太熟練使用的人員來說冗余信息太多。
  • xp之后,MicroSoft發(fā)明了“minidump”的轉(zhuǎn)儲技術,即:小型的,只是包含了必要的線程調(diào)用堆棧等信息文件。該文件很小,很容易通過網(wǎng)絡發(fā)送,同時也可以定制該文件記錄的信息,非常的靈活。
  • 生成minidump的函數(shù)包含在DbgHelp.dll中。
  • 二、pdb文件

    后續(xù)加入!

    三、注意事項

    1、 exe文件、dmp文件和pdb文件必須保持一致!

    在上篇博客中,我們簡單的介紹了如何用dmp文件和pdb文件定位代碼中崩潰位置。鏈接如下:
    http://blog.csdn.net/itworld123/article/details/79041500
    上述能夠成功定位的一個前提是exe文件、dmp文件和pdb文件都是同時生成的,即:exe文件和pdb文件同時生成,dmp文件是由當前exe生成的。若生成崩潰信息之后,又重新編譯了exe,與此同時也重新生成了pdb文件,那么即使代碼沒有任何改動,此時WinDbg也沒有辦法進行代碼行號定位了,顯示的信息如下:

    WRITE_ADDRESS: 0000000c FOLLOWUP_IP: TEST11+100b 012b100b c7050c00000005000000 mov dword ptr ds:[0Ch],5MOD_LIST: <ANALYSIS/>FAULTING_THREAD: 0000139cBUGCHECK_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 746b336a to 012b100bSTACK_TEXT: WARNING: Stack unwind information not available. Following frames may be wrong. 0029f934 746b336a 7efde000 0029f980 77139902 TEST11+0x100b 0029f940 77139902 7efde000 7735f926 00000000 kernel32!BaseThreadInitThunk+0x12 0029f980 771398d5 012b132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63 0029f998 00000000 012b132d 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND: ~0s; .ecxr ; kbSYMBOL_STACK_INDEX: 0SYMBOL_NAME: TEST11+100bFOLLOWUP_NAME: MachineOwnerIMAGE_NAME: TEST11.exeBUCKET_ID: WRONG_SYMBOLSFAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!UnknownWATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a58a12a/TEST11_exe/0_0_0_0/5a58a12a/c0000005/0000100b.htm?Retriage=1Followup: MachineOwner

    上述信息大家可以看到,定位源碼的功能已經(jīng)消失了。

    2、關閉代碼優(yōu)化功能。

    #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; }

    上述代碼在沒有關閉代碼優(yōu)化功能的情況下,按照上篇博客的方法,生成的信息如下:

    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

    大家可以發(fā)現(xiàn),WinDbg確實定位到了源碼位置,但是僅僅是函數(shù)外面,沒有進去。
    后來上網(wǎng)查了很多資料,最后隱約感覺到可能是Release代碼優(yōu)化的原因,所以當我關閉代碼優(yōu)化的時候,成功地定位到了真正的位置。信息如下:

    WRITE_ADDRESS: 00000008 FOLLOWUP_IP: TEST11!ErrorFun+6 [d:\huawei\projects\test11\test11\test11.cpp @ 15] 00df1006 c740080a000000 mov dword ptr [eax+8],0AhMOD_LIST: <ANALYSIS/>FAULTING_THREAD: 000013acBUGCHECK_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 00df102f to 00df1006STACK_TEXT: 0028fbfc 00df102f 00000000 00000000 0028fc50 TEST11!ErrorFun+0x6 [d:\huawei\projects\test11\test11\test11.cpp @ 15] 0028fc0c 00df1232 00000001 003b2888 003b3a40 TEST11!wmain+0x1f [d:\huawei\projects\test11\test11\test11.cpp @ 22] 0028fc50 746b336a 7efde000 0028fc9c 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. 0028fc5c 77139902 7efde000 77413872 00000000 kernel32!BaseThreadInitThunk+0x12 0028fc9c 771398d5 00df1353 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x63 0028fcb4 00000000 00df1353 7efde000 00000000 ntdll!RtlInitializeExceptionChain+0x36STACK_COMMAND: ~0s; .ecxr ; kbFAULTING_SOURCE_CODE: 11: static long __stdcall CrashInfocallback(_EXCEPTION_POINTERS *pexcp);12: 13: void ErrorFun(int *p)14: { > 15: p[2] = 10; //?a¨¤??ਤ¨¤?ê16: }17: 18: int _tmain(int argc, _TCHAR* argv[])19: {20: ::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)CrashInfocallback);SYMBOL_STACK_INDEX: 0SYMBOL_NAME: test11!ErrorFun+6FOLLOWUP_NAME: MachineOwnerIMAGE_NAME: TEST11.exeBUCKET_ID: WRONG_SYMBOLSFAILURE_BUCKET_ID: NULL_CLASS_PTR_DEREFERENCE_c0000005_TEST11.exe!ErrorFunWATSON_STAGEONE_URL: http://watson.microsoft.com/StageOne/TEST11_exe/0_0_0_0/5a58a4b0/TEST11_exe/0_0_0_0/5a58a4b0/c0000005/00001006.htm?Retriage=1Followup: MachineOwner

    拓展:VS2010關閉代碼優(yōu)化的方法:
    項目 -> 工程名 + 屬性
    彈出如下圖所示的框:

    對“優(yōu)化”選擇“已禁用”,默認為“使速度最大化”,確定之后,重新編譯程序即可。

    四、總結

  • 禁用程序優(yōu)化功能。
  • exe、pdb和dmp文件保持一致。
    解釋:exe文件和pdb文件同時生成,dmp文件是由當前exe生成的。
  • 五、源碼

    http://download.csdn.net/download/itworld123/10203098

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的VS2010下使用dmp文件和pdb文件定位程序异常代码行号的注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。