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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法

發布時間:2024/10/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2018-01-12 創建人:Ruo_Xiao 開發環境:Windows7,VS2010,WinDbg 6.12。

一、源碼

#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, //默認安全屬性CREATE_ALWAYS, //總是創建FILE_ATTRIBUTE_NORMAL, //默認屬性NULL //為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);}return 0; }

二、VS2010生成pdb文件

  • 選擇 項目 -> 工程名+屬性,如下圖所示。
    2. 進去
  • 之后選擇 配置屬性 -> 連接器 -> 調試,如下圖所示。
  • 右面選項如下圖所示:

    上圖中,“生成調試信息”為pdb文件生成與否的使能開關,“生成程序數據庫文件”為該pdb文件的名字,默認即可。
  • 三、生成DMP文件

    兩種方法:

  • 利用資源管理器生成,即:程序崩潰之后會彈出“程序已停止運行對話框”,如下圖所示:

    此時在資源管理器“進程頁”中找到該程序,右擊,彈出的下拉菜單中找到“創建轉出文件”選項,單擊即可生成,不過該文件會生成在系統目錄,人工找到即可。
  • 利用API在指定目錄下生成,代碼如上所示。
    (1)SetUnhandledExceptionFilter
    調用時機:當異常發生時,且程序不處于調試模式,則首先調用該函數。
    參數:lpTopLevelExceptionFilter ,函數指針。
    返回值:以前設置的回調函數。
    (2)CreateFile
  • HANDLE CreateFile(LPCTSTR lpFileName, // 指向文件名的指針 DWORD dwDesiredAccess, // 訪問模式(寫 / 讀) DWORD dwShareMode, // 共享模式,0就是不共享,反之共享。LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全屬性的指針 DWORD dwCreationDisposition, // 如何創建 DWORD dwFlagsAndAttributes, // 文件屬性 HANDLE hTemplateFile // 用于復制文件句柄 );

    返回值:若成功,則返回一個句柄,若失敗,則返回INVALID_HANDLE_VALUE,即:-1。
    (3)MINIDUMP_EXCEPTION_INFORMATION
    作用:該結構體包含將要通過 MiniDumpWriteDump函數寫入Minidup文件中的崩潰信息。
    原型:

    typedef struct _MINIDUMP_EXCEPTION_INFORMATION {DWORD ThreadId;PEXCEPTION_POINTERS ExceptionPointers;BOOL ClientPointers; } MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;ThreadId:拋出異常的線程ID。 ExceptionPointers:指向_EXCEPTION_POINTERS結構體的首地址,該結構體指向了異常時處理器上下文和獨立于計算機的異常描述。 ClientPointers:指定崩潰的內存位置。若為TRUE,則崩潰位置位于客戶端自己的地址空間中。若為FALSE,則崩潰內存位于調用該程序的地址空間中。

    (4)MiniDumpWriteDump
    作用:向指定的文件中寫入用戶自己的minidump信息。
    原型:

    BOOL MiniDumpWriteDump ( HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam );hProcess:生成當前信息文件的進程的句柄。 ProcessId:生成當前信息對文件的進程的ID。 hFile:被寫入信息的文件的句柄。 DumpType:向文件中寫入的信息的類型,可查看 MINIDUMP_TYPE 。 ExceptionParam:指向MINIDUMP_EXCEPTION_INFORMATION結構體指針,若為NULL,則沒有信息寫入文件中。 UserStreamParam:指向 MINIDUMP_USER_STREAM_INFORMATION 結構體指針,若為NULL,則文件中沒有用戶指定的信息。 CallbackParam:指向MINIDUMP_CALLBACK_INFORMATION結構的指針,指定要接收擴展小型轉儲信息的回調例程。如果此參數的值為NULL,則不執行回調。

    四、尋找崩潰位置

  • 執行程序,發現程序崩潰,如下圖所示:
  • release目錄下生成了對應的DMP文件,如下圖所示。
  • 打開WinDbg,依次進行下面操作:
    File -> Symbol File Path -> 選擇pdb文件存放路徑。
    File -> Image File Path -> 選擇exe文件存放路徑。
    File -> Open Crash Dump -> 選擇DMP文件存放路徑。
    最后會彈出WinDbg對崩潰文件的初步分析的結果,在下面的輸入框中輸入“!analyze -v”,意思是軟件進行對崩潰文件進行分析,并顯示出來,最后的結果如下所示:
  • 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

    由上述信息中

    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行有異常。

    上述就是簡單地查找崩潰行數的方法。

    五、源碼工程

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

    (完)

    總結

    以上是生活随笔為你收集整理的vs2010 利用DMP文件、pdb文件查找release下的异常行号的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美亚洲自拍偷拍 | 人妻aⅴ无码一区二区三区 阿v免费视频 | 激情综合影院 | 天天射寡妇 | 久久久久久99精品久久久 | 久久免费在线观看视频 | 午夜天堂在线 | 久久国内 | 肥老熟妇伦子伦456视频 | 亚洲不卡一区二区三区 | 性按摩玩人妻hd中文字幕 | 91五月天 | 福利视频网站 | 98超碰在线 | 国产美女毛片 | 中文字幕久久一区 | 久久亚洲AV无码精品 | 欧美乱论 | 人妻巨大乳一二三区 | 91在线精品李宗瑞 | wwwsss在线观看| 国产精品成人久久久 | 天天撸天天射 | 狼人av在线 | 日本成人三级 | 日韩午夜网站 | 日韩一级片在线观看 | 67194少妇| 欧洲成人免费视频 | 欧洲一二三区 | 男女扒开双腿猛进入爽爽免费 | 欧美人与禽性xxxxx杂性 | 亚洲天堂2018av | 四虎影视免费永久大全 | 婷婷久久久久久 | 成人av网站在线播放 | 韩国电影一区 | 国产一区视频在线观看免费 | 成人在线免费电影 | 伊人色区| 好色先生tv官网 | 爱爱短视频 | 中文字幕日日 | 中文在线www | 久久久久久久久国产 | 亚洲精美视频 | 91丨porny丨露出 | 东京热毛片 | 午夜插插插 | 日韩羞羞| 日韩色图在线观看 | 无码人妻精品一区二区三区夜夜嗨 | 韩国一区二区三区视频 | 欧美一区二区人人喊爽 | 特黄aaaaaa私密按摩 | www.国产区 | 极品销魂美女一区二区 | 久久天天躁狠狠躁夜夜躁2014 | 精品人妻无码一区二区三区换脸 | 亚洲v日韩v综合v精品v | 91免费版在线 | 精品国产大片大片大片 | av拍拍拍| 久久黄色| 欧美黄片一区 | 欧美巨鞭大战丰满少妇 | 国产在线高潮 | 欧美精品欧美精品系列 | 一本毛片 | 激情片网站 | 污污污www精品国产网站 | 亚洲男性天堂 | 精品一区二区三区欧美 | 黄色大尺度视频 | 天天色综合图片 | 日本色中色 | 亚洲永久免费 | 国产又粗又长又爽 | 曰女同女同中文字幕 | 亚洲v欧美v另类v综合v日韩v | 丁香六月欧美 | 亚洲精品亚洲 | 99热亚洲精品 | 91精品国产综合久久久久久 | 亚洲手机视频 | 天天射天天草 | 日本三级久久久 | 日韩一区免费 | 日韩社区 | 狠狠艹av| 91日本视频 | 欧美作爱视频 | 国产猛男猛女超爽免费视频 | 欧美在线视频免费观看 | 亚洲欧美日韩精品久久 | 99久久人妻无码精品系列 | 亚洲高清毛片一区二区 | 亚洲成人18| 久久久无码精品亚洲国产 |