ASP.NET 使用 WinDbg 和 SOS 副檔名的疑難排解

文章翻譯 文章翻譯
文章編號: 892277 - 檢視此文章適用的產品。
ASP.NET 支援語音資料行

ASP.NET 使用 WinDbg 和 SOS 副檔名的疑難排解

若要自訂您的需要此資料行的 我們想要邀請您送出您的想法,有關您感興趣的主題,而且在將來知識庫文件和支援語音資料行,處理您想要查看的問題。您可以送出您的想法和使用 Ask For It 表單的意見反應。另外還有連結至表單底部的 這個資料行。
全部展開 | 全部摺疊

在此頁中

再次,Hello,歡迎來到 2005 年一月版本的支援語音資料行。再一次我想要感謝 Jim Cheshire 支援工程師此處在 Microsoft 支援 ASP.NET,對他所佔的比重。曹具有很棒的想法,支援語音資料行,而且想要繼續共用它們。 查閱 Jim 的貢獻上個月和透過下個月或操作,並如往常傳送您為未來的資料行的建議給我們。感謝您 Jim!

Jim 已使用的 Microsoft 六年 FrontPage、 VB 和 ASP.NET 小組成員。在這段時間他已經在 MSDN 上, 寫入 Office 開發人員中心,而他是 FrontPage 選擇性版使用 Microsoft Office FrontPage 2003 中的書籍作者。曹也有在網站上他用來提供可用增益集的 FrontPage 讓網頁開發人員進行最多出的 Microsoft 產品。 以下是該網站位址:
http://www.jimcosoftware.com
因此請向上一個椅子提取、 開始進行的您鞋與讀取透過所有有關疑難排解 ASP.NET,我們資料行和記住可以提交您的想法對我們使用包含在每個資料行中的 「 FOR IT ASK 」 連結我們發佈。
Jeremy

ASP.NET 使用 WinDbg 和 SOS 副檔名的疑難排解


良好的開發人員將規劃任何應變措施。自然,該計劃的一部份開發某些健全的例外處理常式。 許多 ASP.NET 開發人員將會處理的例外狀況,藉由與精美的格式網頁呈現使用者,然後記錄供稍後分析檔案中的 [例外狀況資訊。

案例:

您開發並測試新的 ASP.NET 應用程式,會記錄成記錄檔的例外狀況。 將 ASPX 網頁和組件部署至實際執行 Web 伺服器中。 當人們使用您的應用程式時,他們看錯誤頁面,但沒有例外狀況記錄寫入記錄檔。 您也發現說 Aspnet_wp.exe 意外停止的應用程式事件檢視器 」 記錄檔中有許多 ASP.NET 事件

這是常見的問題,我們看到在 [開發 o 人 h 員 ? 工 u 具 ? 支援類型,而且大多數的我們的客戶真的不知道如何著手進行疑難排解它。更糟的是為可怕的 「 伺服器應用程式無法使用 」 錯誤訊息。這個月我會告訴您您可以要如何疑難排解這些類型的偵錯工具的 Windows 的問題。

免責聲明:如果您呼叫的 Microsoft 開發 o 人 h 員 ? 工 u 具 ? 支援我們通常可能會要求您傳送給我們或擱置傾印檔案損毀傾印檔案。傾印檔案,在本文中的分析將會是相當簡單又快速。在許多情況下一個問題的原因不明顯,而且它可能會需要取得到根本原因分析的許多小時。不要讓簡易性和直線-forwardness 此傾印檔案分析的騙您到它們是這麼簡單的想法。大部分,在實際上都是不!

取得準備

我們開始之前就必須為 Windows 安裝偵錯工具。如果即使您已經安裝複本請確定您有最新版本,因為我們會使用副檔名為 Managed 偵錯也就只隨附偵錯工具 Windows 的最新版本。

您可以從下列 Microsoft 網站下載偵錯工具 Windows 的:
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
您在安裝偵錯工具的 Windows 時您可能要執行自訂安裝到 C:\Debuggers 資料夾。我們將會執行工具從命令] 列並如果路徑短一個它將會進行這樣做因此更容易為您。安裝完成之後,您會要下載範例 ASP.NET 頁面會當機背景工作處理序。
http://download.microsoft.com/download/c/a/1/ca1c6329-3b3f-4d9e-a76d-54c78d3ddfbc/crash.exe
請注意為了讓您就可以產生使用此頁的傾印檔案,您必須執行 ASP.NET 1.1 中與服務封包 1 (SP1) 安裝。未安裝 SP1,此頁面將會執行而不會產生損毀。

您也要為 WinDbg 設定符號路徑。 符號並不需要 Managed 組件上的函式名稱解析的但您必須為原生函式解析符號。若要在 WinDbg 中設定符號路徑:
  1. 開啟 WinDbg。按一下 [開始],指向 [所有程式],然後再按一下 [為 Windows 偵錯工具
  2. 在 [檔案] 功能表上按一下 符號檔路徑
  3. 在 [符號路徑] 對話方塊輸入 [以下的符號路徑]:
    srv*c:\symbols*http://msdl.microsoft.com/download/symbols
  4. 關閉 WinDbg,] 然後輸入在提示儲存基底的工作區資訊的 [是]
現在您已經準備好要建立損毀傾印檔案。

建立損毀傾印檔案

在這個逐步解說中按一下範例] 頁面上的按鈕將會導致 ASP.NET 工作者處理程序,以損毀。在許多情況下不會知道產生損毀的確切步驟。在實際上實際執行應用程式可能會損毀,在某些隨機時間。您會很快就發現不論預測或隨機,就會發生當機。建立傾印檔案是相當容易使用 Adplus 自動化整個程序的 VBScript 檔案。

若要產生傾印檔案,您需要先瀏覽到範例頁面。(不要按一下按鈕)!成功地處理頁面之後您知道已被啟動 Aspnet_wp.exe 處理序 (或在 Windows Server 2003 上的 W3wp.exe 處理序)。現在您已經準備好要偵錯工具附加至背景工作處理序,使其損毀時,您可以擷取傾印檔案。

若要建立傾印檔案:
  1. 開啟 Web] 伺服器上的新命令提示字元,然後變更至偵錯工具的 Windows 安裝的位置的目錄。
  2. 執行下列命令:
    cscript adplus.vbs-損毀-pn aspnet_wp.exe-o c:\crashdump
    如果您正在執行 Microsoft Windows Server 2003 中執行下列命令:
    cscript adplus.vbs-損毀-pn w3wp.exe-o c:\crashdump
我不會進入詳細上 Adplus.vbs 這裡,但是如果您想要的詳細資訊,您可以檢閱下列微軟知識庫文件:
286350如何使用 ADPlus 疑難排解 「 擱置 」 和 「 當機"
執行此命令之後會顯示幾個對話方塊。按一下 [在每個對話方塊中的 [確定]。 您現在應該看到任務長條圖上的按鈕,偵錯器,CDB,偵錯工具應用程式的名稱。不過,它可能會不同視窗中。

Note 當您執行 Adplus 損毀模式中時,您必須是在 Web 伺服器上主控台。您無法從遠端以損毀模式執行 Adplus。

現在您已準備好產生損毀!按一下 [在頁面損毀背景工作處理序] 按鈕。如果您有啟用在 Visual Studio.NET JIT 偵錯,一個對話方塊便會出現讓您知道發生例外狀況,但附加偵錯工具無法處理它。如果您沒有 JIT 啟用偵錯,而不顯示任何對話方塊將會建立傾印檔案。不論是哪一種情況您看到 CDB 按鈕會從任務列中消失後已經傾印檔案,而且您準備好要繼續下一個步驟中。

簽出傾印檔案

  1. 啟動 WinDbg。
  2. 在 [檔案] 功能表上按一下 開啟故障傾印 開啟傾印檔案。(請勿按 開啟舊檔 [] 工具列上的按鈕)
  3. 瀏覽至 C:\Crashdump 資料夾。在該資料夾中,您會看到具有開頭 Crash_Mode_Date 的長名稱的另一個資料夾。Adplus 儲存傾印檔案內的這個資料夾。(您應該有一個以上的傾印檔案資料夾中)。您想要開啟 WinDbg 中傾印檔案是第二的機會例外狀況傾印檔案。它應該是根據哪一個傾印檔案屬於第 2 個機會例外狀況傾印檔案的檔案名稱來明顯識別。
您已開啟傾印檔案之後將會啟動 WinDbg,正在下載符號。視您的網際網路連線速度,此程序可能會花費數分鐘。是完成時您會看到出現 WinDbg,在命令提示字元下圖所示。
摺疊此圖像展開此圖像
 WinDBg window
圖 1: WinDbg-的"0: 000 >"在命令提示字元表示目前的執行緒、 執行緒 0。

您可以在命令提示字元下輸入 kb 命令來查看錯誤堆疊。以下是從傾印檔案輸出:
0:000> kb
ChildEBP RetAddr  Args to Child              
00771018 791b6173 00000643 00000000 00b59bc0 mscorwks!_EH_prolog+0x2
00771928 791b60c0 00771a04 00000000 00000000 mscorwks!EEClass::DoRunClassInit+0xbe
0077193c 791d75a7 00771a04 00771a50 00b59bc0 mscorwks!MethodTable::CheckRunClassInit+0x1d
00771a14 791d7746 00000000 0086fb88 00771a50 mscorwks!MethodDesc::DoPrestub+0x28e
00771a2c 00a92f76 00771a50 0180f154 00ee5cd4 mscorwks!PreStubWorker+0x42
WARNING: Frame IP not in any known module. Following frames may be wrong.
00773a38 0337f2bc 00f8463c 00eb593c 00ee5cc8 0xa92f76
00773a64 031cd7e4 00eb593c 0180ea7c 00f84560 0x337f2bc
00773aac 033a3299 00000000 00eb593c 0180ea7c 0x31cd7e4
00773b50 033a3031 00000001 00000000 0180e238 0x33a3299
00773bec 0332ee47 00edb274 0180df00 00f8463c 0x33a3031
00773c28 0332e71b 0180df00 033a35c5 0180d870 0x332ee47
00773cc4 033a3031 00000001 00000000 0180d2b4 0x332e71b
00773d60 0332ee47 00edb274 0180cf7c 00f8463c 0x33a3031
00773d9c 0332e71b 0180cf7c 033a35c5 0180c8ec 0x332ee47
00773e38 033a3031 00000001 00000000 0180c330 0x332e71b
00773ed4 0332ee47 00edb274 0180bff8 00f8463c 0x33a3031
00773f10 0332e71b 0180bff8 033a35c5 0180b968 0x332ee47
00773fac 033a3031 00000001 00000000 0180b3ac 0x332e71b
00774048 0332ee47 00edb274 0180b074 00f8463c 0x33a3031
00774084 0332e71b 0180b074 033a35c5 0180a9e4 0x332ee47


Note 如果您執行多處理器系統 (或超執行緒的系統) 上您會看到函數呼叫中而非 mscorwks mscorsvr。

因為 WinDbg 下載 mscorwks 的符號,您可以看到 Mscorwks.dll 中的函數名稱。但是,下列 mscorwks 到呼叫,看到沒有模組名稱和沒有函式名稱。那是什麼 Managed 程式碼 (通用語言執行階段下執行的程式碼) 起來 WinDbg 在預設情況下,並顯然不很有幫助的輸出。若要查看該 Managed 程式碼中發生什麼事,您需要使用 WinDbg 為 SOS 延伸模組。

SOS 副檔名

SOS 是可讓您偵錯 Managed 程式碼的 WinDbg 的延伸。SOS 新增許多指令均可著重在偵錯 Managed 應用程式的 WinDbg,並有許多都是特定的 ASP.NET。延伸模組是 DLL 檔,稱為 Sos.dll,而它位於 Clr10] 資料夾內的偵錯工具的 Windows 安裝的位置之資料夾。

若要載入 SOS 副檔名,請在命令提示字元中 WinDbg 輸入下列命令:
.load clr10\sos
不要略過指令的開頭期間!如果一切順利,您將移回到命令提示字元。如果發生錯誤請確定您有最新版本的偵錯工具的安裝 Windows。

我們將討論幾個命令的 SOS 偵錯損毀傾印檔案,但請隨意探索 SOS 中其他的命令上您自己的時間。您可以使用 ! 協助 命令以取得的命令和簡要說明每個清單。

深入根本原因

既然載入 SOS 讓我們看看部分有用疑難排解損毀傾印檔案中的指令。

讓我們來看看目前執行緒的執行緒 0 受管理的堆疊。我們將會執行該使用 「 ! clrstack 命令。型別 ! clrstack 在命令提示字元。WinDbg 啟動堆疊傾印。一般的堆疊應該傾出完全以在幾秒為單位。在這種情況下輸出似乎永遠移。請繼續進行,並按下 CTRL BREAK (或按一下 中斷 WinDbg 上的 [偵錯] 功能表上),然後讓我們來查看。 Here's a portion of the stack:
Void System.Web.HttpServerUtility.ExecuteInternal(String,Class System.IO.TextWriter,Boolean)
Void System.Web.HttpServerUtility.Transfer(String,Boolean)
Void ASP.crash_aspx.btnCrash_Click(Object,Class System.EventArgs)
Void System.Web.UI.WebControls.Button.OnClick(Class System.EventArgs)
Void System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String)
Void System.Web.UI.Page.RaisePostBackEvent(Class System.Web.UI.IPostBackEventHandler,String)
Void System.Web.UI.Page.RaisePostBackEvent(Class System.Collections.Specialized.NameValueCollection)
Void System.Web.UI.Page.ProcessRequestMain()
Void System.Web.UI.Page.ProcessRequest()
Void System.Web.UI.Page.ProcessRequest(Class System.Web.HttpContext)
Void System.Web.HttpServerUtility.ExecuteInternal(String,Class System.IO.TextWriter,Boolean)
Void System.Web.HttpServerUtility.Transfer(String,Boolean)
Void ASP.crash_aspx.btnCrash_Click(Object,Class System.EventArgs)
Void System.Web.UI.WebControls.Button.OnClick(Class System.EventArgs)
Void System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String)
Void System.Web.UI.Page.RaisePostBackEvent(Class System.Web.UI.IPostBackEventHandler,String)
Void System.Web.UI.Page.RaisePostBackEvent(Class System.Collections.Specialized.NameValueCollection)
Void System.Web.UI.Page.ProcessRequestMain()
Void System.Web.UI.Page.ProcessRequest()
Void System.Web.UI.Page.ProcessRequest(Class System.Web.HttpContext
If you look closely, you'll see a pattern here. 我們在開始處理要求和引發回傳。然後,會一個按鈕引發 OnClick 事件。會產生一個 Server.Transfer。[Server.Transfer 然後似乎開始整個程序過一次。在這種情況下執行此迴圈,每次物件會推入堆疊。最後,系統執行完堆疊空間,並一 StackOverflowException,就會發生。

若要更好的了解發生了什麼事這裡,您可以取得更詳細的輸出從堆疊執行 ! clrstack s 命令。這樣可讓您完整的堆疊。以下是一些該輸出。為完整從這個命令輸出,建立傾印檔案,使用 [範例] 網頁,然後再執行指令]。我已編輯過它這裡因為輸出是相當詳細資訊。
0:000> !clrstack -s
Thread 0
System.Web.HttpServerUtility.ExecuteInternal(String,Class System.IO.TextWriter,Boolean)
    ESP/REG  Object   Name
    00773ac4 0180e7f4 System.EventArgs
    00773ac8 00f86c14 System.Web.HttpServerUtility
    00773acc 0180e238 System.Web.UI.WebControls.Button
    00773ad0 0180eac0 System.Object[]
    00773ad4 0180ea7c System.String    /crash.aspx
    00773ad8 00eb593c System.String    c:\inetpub\wwwroot\crash.aspx
    00773ae4 00f84754 System.Web.HttpResponse
    00773ae8 00f846bc System.Web.HttpRequest
    00773b00 00f86bec System.String    crash.aspx
    00773b04 00f86c14 System.Web.HttpServerUtility
    00773b2c 00eef57c System.String    btnCrash
    00773b34 00eef57c System.String    btnCrash
 00773b38 0180e2e4 System.Collections.Specialized.ListDictionary/DictionaryNode
    00773b44 00f797d8 System.String    CausesValidation
    00773b4c 0180e2e4 System.Collections.Specialized.ListDictionary/DictionaryNode
00773b60  033a3031 [DEFAULT] [hasThis] Void System.Web.HttpServerUtility.Transfer(String,Boolean)
    ESP/REG  Object   Name
    00773b60 0180e238 System.Web.UI.WebControls.Button
00773b6c  03360398 [DEFAULT] [hasThis] Void ASP.crash_aspx.btnCrash_Click(Object,Class System.EventArgs)
    ESP/REG  Object   Name
    00773b70 0180e7f4 System.EventArgs
00773b74  033a2fc5 [DEFAULT] [hasThis] Void System.Web.UI.WebControls.Button.OnClick(Class System.EventArgs)
    ESP/REG  Object   Name
    00773b74 0180df00 ASP.crash_aspx
    00773b78 0180e238 System.Web.UI.WebControls.Button
    00773b7c 00f8601c System.Web.HttpValueCollection
    00773b80 0180e314 System.ComponentModel.EventHandlerList
00773b88  033a2da2 [DEFAULT] [hasThis] Void System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String)
即可告知從這個輸出 Server.Transfer 呼叫做為參數傳遞 crash.aspx。您要如何辨別的?一個指示是執行在呼叫之後的頁面 crash.aspx。但是,您也可以告訴藉由查看 HttpRequest 物件。

您可以因此讓我們看一下,請參閱什麼已在該要求中傳遞請參閱在此牌 HttpRequest 物件。我們將會執行該使用 [傾印物件指令 ! 做。此指令採用一個參數: 要傾印物件的位址。在上述輸出中地址會是輸出第二個十六進位數字。

這裡是 HttpRequest 物件的輸出。我已編輯過這個輸出,這是因為的簡潔起見
0:000> !do 00f846bc 
Name: System.Web.HttpRequest
MethodTable 0x03089170
EEClass 0x02e9a1cc
Size 152(0x98) bytes
mdToken: 02000072  (c:\windows\assembly\gac\system.web\1.0.5000.0__b03f5f7f11d50a3a\system.web.dll)
FieldDesc*: 030888b0
      MT    Field   Offset                 Type       Attr    Value Name
03089170  4000626       14                CLASS   instance 00f8457c _path
03089170  4000627       8c       System.Boolean   instance 0 _computePathInfo
03089170  4000628       18                CLASS   instance 00f8457c _filePath
03089170  400062e       2c                CLASS   instance 00f845a4 _pathTranslated
03089170  400062f       30                CLASS   instance 00e6703c _baseVirtualDir
03089170  4000630       34                CLASS   instance 00edce64 _contentType
03089170  4000631       88         System.Int32   instance 85 _contentLength
03089170  400063c       60                CLASS   instance 00f8601c _form
在這個輸出中,您可以看到 _filePath 物件。如果您傾出該使用 ! 嗎 命令您會發現它是字串,包含"/ crash.aspx 」。這可確認遞迴由 crash.aspx 載入以遞迴方式所造成。發生為何,情況不過?讓我們挖更深一層。

回查看從輸出 ! clrstack。如果您仔細看起來,您會看到按鈕的 Click 事件會引發每次載入頁面。這會告訴您處於回傳狀態每次載入頁面。您也可以告訴從堆疊中的 [按一下] 事件呼叫 Server.Transfer 而定。因此,停止 ASP.NET 將當機載入此頁面時,您必須停止這將被回傳每次頁面載入至 [Server.Transfer 由於。

Note 如果您在 ASP.NET Framework 1.1 中與 Server.Transfer SP1 安裝並保留表單的資料,它永遠會造成這個問題。 如需詳細資訊,請按一下下列的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
839521FIX: 的 Server.Transfer 方法會造成堆疊溢位,並會使 ASP.NET 背景工作處理序停止回應
Server.Transfer 方法有兩個參數 ; 第一個是要執行應該轉移的 URL,而第二個是布林值,指定是否應該保留表單資料。如果我們保留表單資料,會發生什麼事?比方之一是,將會認為,ASP.NET 回傳。藉由將第二個參數設定為 false Server.Transfer 呼叫],因此,可以停止這個損毀。

自動換行

本文呈現方式您可以使用 WinDbg 和 SOS 偵錯 ASP.NET 應用程式的簡短逐步解說。本文的目的是要為您介紹的一些概念和術語參與使用者模式偵錯的。它比原始程式碼偵錯,設定的不同技能,並取得擅於它需要大量的時間投資。它是由經驗學到的技能。
為了更多經驗建議您載入組成 ASP.NET 應用程式開發或執行環境中,並在不同時間擷取一些擱置傾印檔案。您可以藉由使用下列命令,以擱置模式執行 Adplus 執行的動作:
cscript adplus.vbs-擱置-pn aspnet_wp.exe-o c:\aspnet_dump

這個命令會立即傾印 aspnet_wp.exe 程序,並在 C:\Aspnet_dump 資料夾中建立傾印檔案。這類的當機傾印檔案可以執行從遠端連線。

Microsoft 的模式和實務群組 (PAG) 已經也寫入某些絕佳深入的發行項上偵錯使用 WinDbg 的.NET 應用程式。請造訪下列 Microsoft 網站,以檢視這些文件:
http://msdn2.microsoft.com/en-us/library/ms954594.aspx
的確,我在撰寫本文的目標之一是提供您善加利用絕佳 PAG 已提供的文件的必要的基礎。我強烈建議您在善加利用它們。
看您回這裡當我教您如何使用 WinDbg 和 SOS 副檔名分析損毀傾印檔案的下個月。直到下一次

曹 Cheshire
支援工程師
Microsoft 開發人員支援

如往常請隨意送出您想要在將來解決資料行的主題或使用 Ask For It 表單的知識庫中的想法。

屬性

文章編號: 892277 - 上次校閱: 2007年5月18日 - 版次: 2.4
這篇文章中的資訊適用於:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
關鍵字:?
kbmt kbhowto kbasp KB892277 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:892277
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com