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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dump文件

發(fā)布時(shí)間:2024/8/23 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dump文件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. Dump文件

1. Dump文件介紹

Dump文件(Dump File),也叫轉(zhuǎn)儲(chǔ)文件,以.DMP為文件后綴。dump文件是進(jìn)程在內(nèi)存中的鏡像文件,通過轉(zhuǎn)換然后存儲(chǔ)成以.DMP后綴的文件。dump文件根據(jù)存儲(chǔ)時(shí)的選項(xiàng)不同,會(huì)生成不同大小的文件,其中記錄信息也自然有所不同。

2. Dump文件分類

程序分兩種,內(nèi)核模式程序和用戶模式程序,也即Ring0程序和Ring3程序。Dump文件是伴隨著程序而生成的,所以Dump文件也同樣分兩種。?
1. Kernel-Mode Dump Files(內(nèi)核模式Dump文件),主要是驅(qū)動(dòng)程序,此文不涉及。?
2. User-Mode Dump Files(用戶模式Dump文件),主要是應(yīng)用程序及服務(wù)程序,此文所講。?
用戶模式Dump文件又分Full User-Mode Dumps和Minidumps。前者生成的是完整的內(nèi)存快照,所以文件比較大。后者依然生成選項(xiàng),生成包含不同信息的Dump文件。此文以Minidumps文件來分析調(diào)試。

3. Dump文件生成方式

  • 通過WinDbg工具的命令?
    用WinDbg來Attach崩潰提示窗口的process,然后輸入.dump /m C:\myapp.dmp命令,即可生成默認(rèn)的miniDump文件(只包含系統(tǒng)信息、加載的模塊(DLL)信息、 進(jìn)程信息和線程信息)。
  • 通過Windows任務(wù)管理器,選擇指定進(jìn)程,右鍵生成轉(zhuǎn)儲(chǔ)文件(此時(shí)的轉(zhuǎn)儲(chǔ)文件即為Full User-Mode Dumps,包含所有信息,所以文件比較大)。
  • 通過代碼在程序崩潰時(shí)生成Dump文件。
  • #include <DbgHelp.h> #pragma comment(lib, "Dbghelp.lib") // 此函數(shù)需要包含上面頭文件和引入相應(yīng)的庫 LONG WINAPI ExceptionFilter(EXCEPTION_POINTERS* _pExcp) { HANDLE hFile = CreateFile( "d:\\Format.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) {return EXCEPTION_CONTINUE_EXECUTION;}MINIDUMP_EXCEPTION_INFORMATION einfo = {0};einfo.ThreadId = ::GetCurrentThreadId(); einfo.ExceptionPointers = _pExcp; einfo.ClientPointers = FALSE; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, // 指定生成默認(rèn)的Minidump文件&einfo, NULL, NULL); CloseHandle(hFile); return EXCEPTION_EXECUTE_HANDLER; }// 下面函數(shù)放在當(dāng)前模塊的入口函數(shù)處,指定ExceptionFilter替換原生的異常處理 // 即當(dāng)原本要彈出崩潰提示窗口前,需要經(jīng)過此函數(shù)處理,可以處理完立即退出,也可以繼續(xù) SetUnhandledExceptionFilter(ExceptionFilter);
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    2. 分析Dump文件

    1. 使用Visual Studio

    • 選擇與生成Dump文件相同版本的VS。
    • 啟動(dòng)VS并打開Dump文件。
    • 必須保證生成Dump文件的程序的PDB文件和源代碼相一致。
    • VS2005打開Dump文件時(shí),直接按F5調(diào)試,代碼會(huì)停在出錯(cuò)的地方,通過Call Stack窗口查看。
    • VS2010打開Dump文件時(shí),?
      ?
      需要通過Set symbol paths設(shè)置符號(hào)文件路徑,也即PDB文件路徑。然后點(diǎn)擊Debug with Native Only,代碼即會(huì)暫時(shí)在出錯(cuò)的地方,通過Call Stack窗口查看相關(guān)信息。

    2. 使用WinDbg

    • 選擇相應(yīng)版本的WinDbg,x86還是AMD64(也即X64,因?yàn)?4桌面架構(gòu)系統(tǒng)是AMD最新發(fā)布)。
    • File->Open Crush Dump,打開指定的Dump文件。
    • File->Symbol File Path,添加srv*D:\Symbols*http://msdl.microsoft.com/download/symbols
    • File->Symbol File Path,添加程序的PDB文件夾路徑。這樣可以調(diào)試系統(tǒng)DLL,也可以調(diào)試自有程序。
    • 然后在WinDbg命令行中輸入!analyze -v,等待WinDbg分析完畢。
    • 通過上圖,即可以看到代碼崩潰的行數(shù)。

    3. 自定義崩潰窗口

  • 通常Windows會(huì)提供一個(gè)默認(rèn)的崩潰提示窗口,或者是程序直接閃退。?
  • 重寫ExceptionFilter函數(shù),即可以重新定義崩潰窗口,用以提示用戶發(fā)送相關(guān)信息給軟件提供商。?
  • 示例代碼?
    示例代碼是Win32類型的DLL,導(dǎo)出接口SetCustomUnhandledExceptionFilter在Solution的啟動(dòng)Project的最開始調(diào)用一次即可。?
  • 總結(jié)

    以上是生活随笔為你收集整理的Dump文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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