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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试

發(fā)布時(shí)間:2024/4/11 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
本文關(guān)鍵字:Minidumps, Windows, SEH, VisualC, .NET
摘要

本文講述了 minidumps 是怎樣工作的、當(dāng)你的程序崩潰的時(shí)候應(yīng)該如何生成它們、以及如何在 Visual Studio .NET 中將它們重新讀入。

原文作者:Andy Pennell
中文翻譯:Victor
原文鏈接:http://www.codeproject.com/debug/postmortemdebug_standalone1.asp

如果你的程序在客戶的機(jī)器上崩潰了,那么你現(xiàn)在可以使用 minidumps 和 Microsoft Visual Studio .NET 調(diào)試器在事后進(jìn)行調(diào)試。本文講述了 minidumps 是怎樣工作的、當(dāng)你的程序崩潰的時(shí)候應(yīng)該如何生成它們、以及如何在 Visual Studio .NET 中將它們重新讀入。微軟的錯(cuò)誤報(bào)告程序之所以能夠改進(jìn) Windows 操作系統(tǒng)和諸如 Visual Studio .NET 這樣的應(yīng)用程序的穩(wěn)定性,其關(guān)鍵就在于 minidumps。本文也講述了如何使用 Microsoft 符號服務(wù)器自動(dòng)地為系統(tǒng)組件查找符號。你在閱讀本文前應(yīng)該已經(jīng)熟悉 Win32 和 C++ 編程了。

目錄
  • 什么是 Minidump?
  • 創(chuàng)建一個(gè) Minidump
  • 與 Build 相關(guān)的問題
  • 使用 MiniDumpWriteDump 寫一個(gè) Minidump
  • 使用 Visual Studio .NET 讀入一個(gè) Minidump
  • 微軟是如何使用 Minidumps 的
  • 進(jìn)一步改進(jìn)
  • 總結(jié)
  • 附:版權(quán)及免責(zé)聲明
什么是 Minidump?

一個(gè) minidump 就是一個(gè)文件,它包括了崩潰的應(yīng)用程序中最重要的部分。它在用戶的機(jī)器上生成,然后用戶就可以將其提交給開發(fā)人員。開發(fā)人員可以裝入這個(gè) dump,以便查找崩潰的原因,并發(fā)布一個(gè)補(bǔ)丁。

從早期的 Windows NT 開始,Dr.Watson 程序就能夠生成以 .dmp 為擴(kuò)展名的崩潰 dump 文件。但是它們卻沒有想像中那樣有用,因?yàn)橛袃蓚€(gè)問題:

  • 它們太大了。一個(gè)應(yīng)用程序的 dump 包含了整個(gè)進(jìn)程空間中的每一個(gè)字節(jié),所以即使是 Notepad 這么簡單的程序崩潰后也會(huì)產(chǎn)生幾兆的 dump 文件,如果是 Word 這樣的應(yīng)用程序崩潰了的話,可能會(huì)產(chǎn)生上百兆的 dump 文件。
  • 它們所包含的內(nèi)容并不都是有用的。事實(shí)上,Dr.Watson 是一個(gè) just-in-time(JIT)調(diào)試器,但調(diào)試器很難得到一個(gè)已加載模塊的完整路徑。完整的調(diào)試器,例如 Visual Studio 調(diào)試器,為了獲得這些路徑進(jìn)行了很多額外的工作,但是 Dr.Watson 卻沒有。這通常就會(huì)導(dǎo)致毫無意義的模塊名,如 MOD0000 等等。
  • Minidumps 在設(shè)計(jì)時(shí)就使用了幾個(gè)方法用來解決上述問題:

    • 只有幾個(gè)區(qū)域被保存下來,而不是整個(gè)進(jìn)程空間。保存諸如 Kernel32.dll 這樣的模塊簡直毫無意義;只要給出了版本號,就可以很容易地從一張 Windows CD 上拿到這個(gè)文件。默認(rèn)情況下,程序的內(nèi)存堆是不保存的;不需要調(diào)試一個(gè)崩潰比率高得令人乍舌的崩潰點(diǎn)。當(dāng)然,如果你想的話,還是可以把堆保存下來的。
    • Minidump 生成代碼可以得到精確、完整的模塊信息,包括它們的名字、路徑、版本信息和內(nèi)部時(shí)間戳。
    • Minidump 生成代碼還可以得到線程列表,包括它們的上下文(也就是寄存器集合)和堆棧中的內(nèi)容。
    • 整個(gè)文件是壓縮的,進(jìn)一步減小了大小。在 Windows XP 上,一個(gè) Notepad 的 minidump 大概在 6K 左右,比上面提到的同一進(jìn)程的崩潰 dump 小了將近 300 倍。

    注意:Windows XP 在計(jì)算機(jī)停止響應(yīng)后也會(huì)生成一種內(nèi)核態(tài)的 minidumps,但是本文討論的是更常見的用戶態(tài) minidumps。

    創(chuàng)建一個(gè) Minidump

    有三種方法可以創(chuàng)建一個(gè) minidump:

    • 在你自己的應(yīng)用程序中添加代碼,在遇到一個(gè)未捕獲的異常時(shí)寫 minidump。
    • 在 Visual Studio .NET 的集成開發(fā)環(huán)境中調(diào)試程序,單擊“調(diào)試”菜單上的“將轉(zhuǎn)儲(chǔ)另存為”。
    • 什么也不做。

    方法一將在下文中詳細(xì)討論。

    方法二僅適用于一個(gè)已經(jīng)裝了調(diào)試器的工作站,很有可能只在開發(fā)團(tuán)隊(duì)內(nèi)才有用(例如:在另一個(gè)開發(fā)者或者測試人員的機(jī)器上)。如果你使用 Visual Studio .NET 對崩潰進(jìn)行調(diào)試,那么你就可以這么做了。你可以保存一個(gè) Minidump 或者一個(gè)包含堆的 Minidump。你不需要任何符號或者 PDB 文件就可以保存一個(gè) dump 文件;但是在將它們重新讀入時(shí)你需要。

    方法三只在 Windows XP 下有效,如果程序遇到了一個(gè)未捕獲的異常,并且沒有啟動(dòng) JIT 調(diào)試器,系統(tǒng)就會(huì)自動(dòng)創(chuàng)建一個(gè) minidump。然后,這個(gè) minidump 將直接提交給 Microsoft,你就沒有機(jī)會(huì)查找崩潰的原因了。

    與 Build 相關(guān)的問題

    為了使你的程序在崩潰時(shí)創(chuàng)建 dumps,你必須配置你的生成選項(xiàng)使其生成完整的調(diào)試信息,特別是在生成最終版的時(shí)候。生成 PDB 文件之后,你必須將你要發(fā)布給用戶的每一個(gè)二進(jìn)制文件及其對應(yīng)的 PDB 文件進(jìn)行歸檔;之后在調(diào)試那些用戶提交的 minidumps 時(shí)你將需要這些 PDB 文件。

    此外,確保你的二進(jìn)制文件中包含正確的版本信息。你所發(fā)布的每一個(gè)組件的每一個(gè)版本都應(yīng)該有一個(gè)不同的版本號,以便你能夠與 minidump 對應(yīng)起來。版本字段(二進(jìn)制資源中的版本信息——譯者注)可以幫你匹配這兩者。但調(diào)試器本身并不使用版本信息,它是基于 PE 文件頭內(nèi)包含的內(nèi)部時(shí)間戳來匹配二進(jìn)制文件的。

    輸出時(shí),為最終版生成調(diào)試信息會(huì)有一些小的影響。會(huì)生成一個(gè) PDB 文件,在生成所使用的機(jī)器上占用一些空間,而且最終生成的二進(jìn)制文件會(huì)增大幾百個(gè)字節(jié)以便在 PE 文件中記錄調(diào)試目錄下的 PDB 文件名。你不應(yīng)該向用戶發(fā)布 PDB 文件;這會(huì)使你的程序更容易地被用戶反向工程。

    使用 MiniDumpWriteDump 寫一個(gè) Minidump

    用來保存一個(gè) minidump 的關(guān)鍵 API 是 MiniDumpWriteDump,它從 DbgHelp.dll 中導(dǎo)出,這是一個(gè) Platform SDK 中可以再分發(fā)的 DLL。確保你使用的是 Windows XP 版本 5.1.2600;更早期的 beta 和 release candidate 版中的這個(gè) API 有問題,并且 Windows 2000 中包含的 5.0.x 版中沒有導(dǎo)出這個(gè)函數(shù)。如果你有比 5.0 更早的版本,那么它一定是來自于 System Debugger package(包括 WinDbg 等工具),并且它是不可再分發(fā)的。

    在調(diào)用這個(gè) API 之前,你需要用 SetUnhandledExceptionFilter API 設(shè)置一個(gè)未捕獲異常的處理器(Unhandled Exception Handler,也就是 Top-level Exception Filter,最后一個(gè)異常過濾器——譯者注),以便能夠捕獲到崩潰點(diǎn)。這樣就可以使這個(gè) Filter 函數(shù)在程序遇到未捕獲的異常的時(shí)候被調(diào)用。在某些未捕獲的異常中,比方說兩次堆棧溢出(double stack fault,即在處理 stack fault 的時(shí)候又發(fā)生了 stack fault——譯者注),操作系統(tǒng)會(huì)立即結(jié)束應(yīng)用程序,既不會(huì)調(diào)用 filter、也不會(huì)啟動(dòng) JIT 調(diào)試器(據(jù)查,網(wǎng)上資料說如果發(fā)生了 triple fault,CPU 將會(huì)關(guān)閉,到時(shí)候除了 Reset 信號,就沒有什么能救得了這臺機(jī)器的了。所以可以認(rèn)為 double fault 是非常嚴(yán)重的情況——譯者注)。

    在你的 filter 函數(shù)中,你需要加載 DbgHelp.dll。這并不是調(diào)用 LoadLibrary 這么簡單;在 Windows 2000 系統(tǒng)中,你將會(huì)訪問到 System32 目錄下的那個(gè)不正確的版本。演示代碼試著從 EXE 文件所在的位置裝入這個(gè)庫。將正確版本的 DbgHelp.dll 放在 EXE 文件所在的目錄下;否則的話,代碼只好進(jìn)行一次普通的 LoadLibrary 調(diào)用,這也就使得程序只能在 Windows XP 下工作。

    裝入 DLL 后,它接著檢查導(dǎo)出函數(shù)名;如果正確的話,它會(huì)用合適的名字創(chuàng)建一個(gè)文件,比方說用程序名加 .dmp 后綴保存在臨時(shí)目錄中。這個(gè)文件句柄接著會(huì)傳遞給 API,并附上一些其它的信息,諸如進(jìn)程 ID 和所需的 dump 文件類型等。例子中使用的是 MiniDumpNormal。也許你想使用 MiniDumpWithDataSegs 標(biāo)志位,也就是相當(dāng)于 Visual Studio 調(diào)試器中的“附帶堆信息的小型轉(zhuǎn)儲(chǔ)”選項(xiàng),這顯然會(huì)使 dump 文件變得更大。

    在 .dmp 文件創(chuàng)建完成后,程序會(huì)詢問用戶將其保存在什么位置。然后用戶就可以通過 e-mail 或者使用 FTP 將文件發(fā)送過來供你分析。

    如果你想使用本文所提供的演示代碼的話,就在你的工程中加入 mdump.h 和 mdump.cpp 文件,并聲明一個(gè)全局的 MiniDumper 對象。這個(gè)對象的構(gòu)造函數(shù)需要一個(gè)參數(shù),也就是 minidump 文件的基礎(chǔ)文件名。為了能夠正常運(yùn)行,你還需要把正確的 DbgHelp.dll 放在 EXE 所在的目錄下。

    不能使用調(diào)試器調(diào)試寫 minidump 的那段代碼(在演示代碼中,也就是 Minidumper::TopLevelFilter)。如果進(jìn)程附加了一個(gè)調(diào)試器,那么未捕獲異常的處理函數(shù)將永遠(yuǎn)不會(huì)被調(diào)用(關(guān)于這一點(diǎn),MSDN 中關(guān)于結(jié)構(gòu)化異常處理的文檔說得很清楚:調(diào)試器有兩次機(jī)會(huì)處理一個(gè)異常,一次是在異常剛剛發(fā)生時(shí),也就是 VC6 經(jīng)常報(bào)出來的“First-chance exception”;還有一次是在執(zhí)行了所有的 filter,發(fā)現(xiàn)沒有一個(gè)能夠處理之后,通知調(diào)試器發(fā)生了一個(gè)“Second-chance exception”,此時(shí)調(diào)試器會(huì)中斷程序并進(jìn)入調(diào)試模式,因?yàn)榻^大多數(shù)情況下這就屬于未捕獲的異常,是程序 BUG,在非調(diào)試環(huán)境下是要崩潰的——譯者注)。如果你遇到了問題需要調(diào)試的話,你需要使用 MessageBox 調(diào)試。

    使用 Visual Studio .NET 讀入一個(gè) Minidump

    文章的這一部分使用了一個(gè)例子,在 Windows 2000 系統(tǒng)下手工創(chuàng)建了 Notepad 的一個(gè) minidump,然后在 Windows XP 系統(tǒng)下調(diào)試。

    啟動(dòng) Visual Studio .NET,單擊“文件”菜單上的“打開解決方案”,在“文件類型”下拉列表框中選擇“轉(zhuǎn)儲(chǔ)文件(*.dmp; *.mdmp)”(555~~~為什么我在 Visual Studio .NET 2003 中找不到這一項(xiàng)……不過還好,可以直接雙擊 .dmp 文件打開——譯者注),找到 minidump 文件,然后點(diǎn)擊“打開”創(chuàng)建一個(gè)缺省工程。

    按 F5 在調(diào)試器中啟動(dòng)這個(gè) dump,這一步將為你開始調(diào)試提供一些信息。調(diào)試器將創(chuàng)建一個(gè)假的進(jìn)程;在輸出窗口中顯示了很多模塊加載的消息。此時(shí)調(diào)試器僅僅是在重建崩潰時(shí)的進(jìn)程狀態(tài)。在顯示了一條 EXE 不包含調(diào)試信息的警告消息之后,調(diào)試器停在了用戶崩潰的地方,諸如一個(gè)非法訪問什么的。這時(shí)候如果你查看調(diào)用棧窗口,你會(huì)發(fā)現(xiàn)缺少符號和很多有用的信息。

    圖 1:起初沒有符號文件的堆棧窗口

    為了讀取一個(gè) minidump,你通常需要相關(guān)的二進(jìn)制拷貝。為了找到正確的二進(jìn)制文件,打開模塊窗口。

    圖 2:起初沒有二進(jìn)制文件的模塊窗口

    圖 2 展示了 Notepad 的例子,并且說明了兩個(gè)情況。首先,二進(jìn)制所在的路徑名前標(biāo)上了一個(gè)星號,這表示這些是在用戶機(jī)器上的模塊路徑,但是在本地卻找不到對應(yīng)的二進(jìn)制文件。其次,在“Information”一列中全都寫著“No matching binary found”。找到對應(yīng)的二進(jìn)制文件的關(guān)鍵是注意“Version”字段和文件名。在這個(gè)例子中,大多數(shù)系統(tǒng)文件的版本號都是 2195,也就是 Windows 2000。雖然無法從這些信息上立即得知確切的 service pack (SP) 或者 quality fix engineering (QFE),但這些信息可以從微軟的 DLL 幫助數(shù)據(jù)庫中查詢到:http://support.microsoft.com/servicedesks/fileversion/dllinfo.asp。

    現(xiàn)在,你需要找到一張 Windows 操作系統(tǒng)的 CD 或者已經(jīng)安裝了正確版本的機(jī)器,然后將所需要的文件復(fù)制到一個(gè)目錄。通常情況下沒有必要把進(jìn)程中每個(gè)模塊的二進(jìn)制文件都找出來,但是找出那些在每個(gè)調(diào)用棧上的關(guān)鍵模塊是很重要的。這通常包括操作系統(tǒng)的二進(jìn)制文件(例如 Kernel32.dll)和你自己的二進(jìn)制模塊(在這個(gè)例子中就是 Notepad.exe)。

    在你找到這些二進(jìn)制文件、并把它們拷貝到一個(gè)本地目錄之后,單擊“調(diào)試”菜單中的“停止調(diào)試”命令。然后在解決方案資源管理器中,右鍵單擊工程圖標(biāo),在快捷菜單上單擊“屬性”,你將看到“調(diào)試”屬性頁。在“命令參數(shù)”中填入“MODPATH”,跟上一個(gè)等號,然后輸入二進(jìn)制文件所在的位置,如果有多個(gè)位置,可以用分號分隔。在這個(gè)例子中,它是:

    MODPATH=m:\sysbits

    在設(shè)置好了路徑之后,按 F5 重新裝入 minidump,MODPATH 的值將通過命令行參數(shù)傳遞給調(diào)試器;在 Visual Studio .NET 的后續(xù)版本中應(yīng)該會(huì)有更方便的方法設(shè)置這個(gè)參數(shù),或許可以作為一個(gè)選項(xiàng)出現(xiàn)在屬性對話框中。

    盡管找到二進(jìn)制文件并不太可能改善調(diào)用棧窗口的情況,但是它卻能解決模塊窗口中的問題,如圖 3 所示:

    圖 3:找到二進(jìn)制文件后的模塊窗口

    它現(xiàn)在顯示的不再是“No matching binary found”,而是“Cannot find or open a required DBG file”(我怎么覺得這個(gè)地方的英文語法應(yīng)該用“nor”而不是“or”……呵呵,不管它了,反正微軟程序中無傷大雅的語法錯(cuò)誤已經(jīng)不是第一次被發(fā)現(xiàn)了——譯者注)和“No symbols loaded”。前一條消息出現(xiàn)在那些使用 DBG 文件存儲(chǔ)調(diào)試信息的系統(tǒng) DLL 上,后一條消息則出現(xiàn)在使用 PDB 文件的 DLL 上。找到對應(yīng)的二進(jìn)制文件并不能使你看到調(diào)用棧;你還需要找到它們對應(yīng)的調(diào)試信息。

    方法 A:坎坷之路

    為了完整地分析一個(gè) minidump,你需要找到所有的調(diào)試信息。但為了節(jié)省時(shí)間,你可以只找那些你需要的信息。本例中的調(diào)用棧列表包含了 User32.dll 和 Kernel32.dll,所以需要它們的調(diào)試信息。

    對應(yīng)的調(diào)試信息操作系統(tǒng)所需的文件
    Windows NT 4DBGs
    Windows 2000DBGs, PDBs
    Windows XPPDBs

    一個(gè)找系統(tǒng)符號的好地方在?http://www.microsoft.com/ddk/debugging,你也可以在 Windows NT Server 和 Windows 2000 Server 操作系統(tǒng)的 Support CD 上找到系統(tǒng)符號。在本例中,它們被拷貝到了二進(jìn)制代碼所在的位置。實(shí)際情況中你可能會(huì)遇到非微軟發(fā)布的二進(jìn)制模塊,這時(shí)候你就需要它們的 PDB 文件了。同樣在本例中,Notepad 的 DBG 和 PDB 文件也被拷貝了出來,因?yàn)樗俏覀兪褂玫臉颖緫?yīng)用程序。

    在單擊“調(diào)試”菜單上的“停止調(diào)試”命令后再按 F5 就會(huì)看到調(diào)用棧列表,如圖 4 所示。你也許發(fā)現(xiàn)了,由于添加了新的二進(jìn)制文件和調(diào)試信息,調(diào)用棧發(fā)生了變化。這就是我們要的結(jié)果;只有在具有調(diào)試信息的情況下才能準(zhǔn)確地回溯一個(gè)調(diào)用棧,提供的信息越詳細(xì),你得到的堆棧就越精確,通常能夠把那些原來沒有顯示出來的棧幀信息暴露出來。

    在本例中并沒有崩潰。在實(shí)際情況中,這些信息應(yīng)該已經(jīng)能夠幫助你查找出大概 70% 的崩潰原因。另外,本例中的調(diào)用棧列表是使用微軟隨系統(tǒng)組件提供的、經(jīng)過刪減的符號文件所生成的,所以沒有行號信息。如果你使用自己生成的、完整的 PDB 文件,你可以看到一個(gè)更詳盡的調(diào)用棧。

    圖 4:找到符號和二進(jìn)制文件后的調(diào)用棧窗口

    符號服務(wù)器

    如果你需要處理大量 minidumps,進(jìn)行大范圍調(diào)試,那么存儲(chǔ)和訪問所有的二進(jìn)制文件以及 PDB/DBG 文件將變得很困難。Windows NT 中包含了一種叫做符號服務(wù)器的技術(shù),起初只是用來存儲(chǔ)符號文件的,后來擴(kuò)展到也支持二進(jìn)制文件的查找。Windows NT 調(diào)試器是第一個(gè)支持它的工具,但實(shí)際上 Visual Studio .NET 也支持它,雖然沒有文檔提及(事實(shí)上,在 Visual Studio .NET 2003 的文檔中和 MSDN 的 Knowledge Base (KB) 中都有講到如何使用符號服務(wù)器,KB 中的 Q319037 和 Q311503 分別講述了如何在 Visual Studio .NET 2002 和 Visual Studio 6.0 中使用符號服務(wù)器,甚至還包括了一個(gè)詳細(xì)無比的、傻瓜式的教學(xué)視頻。在 MSDN 中搜索關(guān)鍵字“symsrv.dll”可以找到這部分內(nèi)容——譯者注)。關(guān)于符號服務(wù)器,可以參考?http://www.microsoft.com/ddk/debugging/symbols.asp。

    方法 B:康莊大道——使用符號服務(wù)器

    首先,去?http://www.microsoft.com/ddk/debugging?下載調(diào)試工具。你需要安裝 Symsrv.dll 文件,你可以將它拷貝到 devenv.exe 所在的目錄下,或者放到你的 System32 目錄下,以便 Visual Studio .NET 可以訪問到它。在復(fù)制了 Symsrv.dll 文件之后,你就可以安全地卸載調(diào)試工具了。你還需要?jiǎng)?chuàng)建一個(gè)本地目錄,在本例中,創(chuàng)建了一個(gè)本地目錄 C:\localstore。

    在工程屬性對話框中的“調(diào)試”屬性頁上,填寫“符號路徑”:

    SRV*c:/localstore*http://msdl.microsoft.com/download/symbols

    這個(gè)字符串會(huì)告訴調(diào)試器使用符號服務(wù)器來獲取符號文件,并在本地創(chuàng)建一個(gè)符號服務(wù)器,用來存放符號文件。現(xiàn)在,當(dāng)你在 minidump 工程中按下 F5 后,符號文件將從微軟的網(wǎng)站上拷貝到本地服務(wù)器。在第一次下載后,之后的加載速度就會(huì)快很多,因?yàn)榉栁募谋镜胤?wù)器中直接加載,不再需要通過 Web 下載了。

    在調(diào)試微軟之外的程序時(shí),你應(yīng)該將方法 A 和方法 B 結(jié)合起來。用方法 A 獲得系統(tǒng)組件的符號文件(反了吧?好像應(yīng)該用方法 B 吧……不過原文確實(shí)是“Use A to get the system components”——譯者注),然后附上你自己的符號文件路徑,用分號將它們隔開,例如:

    c:\drop\build\myapp;SRV*c:\localstore*http://msdl.microsoft.com/download/symbols

    由于符號服務(wù)器是 Visual Studio .NET 中的一個(gè)沒有文檔說明的特性,所以沒有錯(cuò)誤報(bào)告。如果表達(dá)式錯(cuò)誤或者 Symsrv.dll 文件的位置不正確,符號文件就不能被加載,只能在模塊窗口中顯示“No symbols loaded”的錯(cuò)誤信息。你也可以使用符號服務(wù)器存儲(chǔ)和下載二進(jìn)制文件,但是 MODPATH 表達(dá)式需要使用“symsrv*symsrv.dll*”而不是“SRV*”(MSDN 中對于“srv”的解釋是:“This is shorthand for symsrv*symsrv.dll.”——譯者注)。

    注意:微軟的符號服務(wù)器不包含二進(jìn)制文件,但是你自己創(chuàng)建的符號服務(wù)器卻可以。

    符號服務(wù)器不僅僅是用來調(diào)試 minidumps 的,它提供了一種“在線”調(diào)試的方法。在使用符號服務(wù)器之前,別忘了正確地配置“調(diào)試”屬性頁上的“符號路徑”選項(xiàng)。

    微軟是如何使用 Minidumps 的

    微軟使用 minidumps 改進(jìn)其程序的歷史已經(jīng)有一年多了(本文發(fā)布于 2002 年 3 月 7 日——譯者注)。Microsoft Internet Explorer 5.5 和 Microsoft Office XP 是第一批與新版的 Dr.Watson 同時(shí)發(fā)布的產(chǎn)品。這個(gè)新版的 Dr.Watson 可以在程序停止響應(yīng)時(shí)捕獲程序中未處理的異常,創(chuàng)建一個(gè) minidump,然后詢問用戶是否愿意將信息提交給微軟。

    進(jìn)一步改進(jìn)

    在服務(wù)器端,可以根據(jù)發(fā)生崩潰的組件和崩潰點(diǎn)對 minidumps 進(jìn)行分析和歸類,這樣就可以使產(chǎn)品組得到程序的崩潰頻率、以及某個(gè)崩潰情況的發(fā)生頻率,小組也可以得到崩潰時(shí)的 minidumps 以便日后分析。在某些情況下,如果崩潰的原因已經(jīng)完全查明,則用戶可以被引導(dǎo)到一個(gè)網(wǎng)頁,這個(gè)頁面上有已知的、可以暫時(shí)避免這種崩潰的方法,或者一個(gè)解決該問題的補(bǔ)丁。在 Internet Explorer 5.5 和 Office XP 發(fā)布后,有很多其他產(chǎn)品組已經(jīng)開始使用類似的技術(shù)收集崩潰信息了。它同時(shí)也是 Windows XP 的一個(gè)標(biāo)準(zhǔn)部分。

    本文中討論的例子主要是用來理解 minidumps 的,沒有涉及到如何從用戶機(jī)器上返回 dump 文件(在 CodeProject 還有一篇文章是專門講這個(gè)處理過程的,也就是著名的 BT 客戶端軟件 BitComet 所使用的崩潰信息報(bào)告程序 XCrashReport——譯者注)。在最簡單的情況下,可以提示用戶使用 e-mail 發(fā)送 minidump 文件。但是要注意,這可能會(huì)帶來隱私方面的問題,因?yàn)橛脩魯?shù)據(jù)也許就存儲(chǔ)在于堆棧中,對于一個(gè)包含完整堆信息的 minidump 來說,則一定會(huì)有用戶數(shù)據(jù)在其中,這一點(diǎn)要讓用戶清楚。微軟的 Data Collection Policy 中有一些額外的信息用來說明 minidumps 所包含的所有詳細(xì)內(nèi)容,它位于:http://watson.microsoft.com/dw/1033/dcp.asp。

    另外,如果在一個(gè) Windows 服務(wù)中遇到了未處理的異常,那么為它創(chuàng)建 minidumps 將是另一個(gè)挑戰(zhàn)。你需要處理桌面訪問(例如,如果沒有人在使用控制臺,那么你就無法提示他們)以及安全上下文。

    總結(jié)

    Minidumps 是一種新技術(shù),它使得程序在用戶的機(jī)器上崩潰后也可以進(jìn)行事后調(diào)試。向已有的程序中加入代碼、使其在遇到未捕獲的異常時(shí)自動(dòng)創(chuàng)建 minidumps 也是一件很容易的事。Visual Studio .NET 可以很容易地載入它們,從而重現(xiàn)崩潰現(xiàn)場、使得開發(fā)人員可以調(diào)試程序。符號服務(wù)器可以很輕松地找到系統(tǒng)符號文件,幫助分析。


    總結(jié)

    以上是生活随笔為你收集整理的使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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