COM+物件池元件崩潰除錯手記 (轉)

gugu99發表於2007-08-15
COM+物件池元件崩潰除錯手記 (轉)[@more@]

COM+:namespace prefix = o ns = "urn:schemas--com::office" />

崩潰手記

 

文件版本

版本

建立時間

建立人

備註

1.0.0.1

-7-20

鄭 昀

第一稿

 

 

 

 

Implementation pe:

本文件將說明XMsg II元件在COM+應用中面對高頻率的併發發生了崩潰,崩潰地址在NTDLL.DLL內。以及除錯的過程。

 

繼續閱讀之前,我們假設您熟悉以下知識:

n  n  Exception Monitor

n  n  程式映像轉儲

n  n  W32dasm

 

如果有 XP Symbols,那麼我們也許會更快找到NTDLL.DLL的崩潰。

 

背景知識

XMsg II元件是一個COM+物件池元件,執行緒模型是MTA。當它被COM+啟用時,它會先去讀取本地XML,得到相關的啟動引數。然後,呼叫它的介面方法傳送。最後,使用者呼叫它的GetResponse方法得到 Response XML文件。

 

現象

1:

XMsg II元件的呼叫不頻繁的時候,並沒有出現崩潰。

2:

我製作了一個testXMsg.頁面,模擬呼叫XMsg.Dll;

我製作了一個Windows Console Application(TestXMsg.ASP.exe),模擬200個執行緒併發向發起HTTP POST請求;

XMsg II元件所在的COM+應用Tomo_X,會在所有呼叫結束三分鐘之後,自動關閉COM+應用,結束這個DLLHOST.EXE程式。

在整個TestXMsg.ASP.exe執行過程中,沒有出現任何崩潰。但是在事隔三分鐘之後,崩潰出現。

跟蹤的困難所在

在反覆測試TestXMsg.ASP.exe的時候,最大的問題重現崩潰必須有以下要素:

n  n  元件在COM+應用中;

n  n  元件的介面啟用了物件池;

n  n  併發呼叫。

 

這樣有以下難點:

n  n  很難用進行跟蹤。其實,單元測試的時候,用BounsChecker並沒有查出問題,元件例項釋放的時候也很順利。

n  n  很難從Trace Log中看到有價值的資訊。幾百個呼叫併發呼叫,而且崩潰是在NTDLL.DLL中。

利用Exception Monitor確定崩潰源頭

這種進入執行中的COM+應用的除錯,最好的工具就是Microsoft Exception Monitor 7.0了。

它可以跟蹤進入各種Windows服務執行例項,其中最重要的兩個服務是:

þ  þ  Microsoft Inte Information Service (In Process)

þ  þ  COM+ Application / MTS Package / (Pooled/Out Of Process)

 

我們選擇監視“COM+ Application / MTS Package / IIS (Pooled/Out Of Process)”。你會看到以下對話方塊,列出了可供監視的所有COM+程式外應用:

 

 

選擇我們的“Tomo_UM_X”COM+應用。

在下面的“Start Monitoring”對話方塊中,點選“Run This Monitoring Session”按鈕:

 

 

這樣,就會啟動WinG Deger,Attach到Tomo_X應用例項上。如下圖所示:

 

 

之後,靜靜等待COM+應用在三分鐘之後的自動關閉應用了。那一刻,WinDBG螢幕上一陣狂閃,然後消失,只留下了Exception Monitor的“Session Status”對話方塊,如下所示:

 

 

你可以選擇最近的那個日誌,然後點選“View Log”按鈕,如下所示:

 

 

P.T.C

首先,我們來檢視“P.T.C”報告了什麼:

***** Activity prior to crash *****

……….

Thread Tenate:  Process=0, Thread=11, Exit Code=0

Thread Terminate:  Process=0, Thread=6, Exit Code=0

First chance exception c0000005 (Access Violation) occurred

Thread stopped.

 

它基本上列印出了崩潰之前的DEBUG OUTPUT的內容。

 

Report

這個“Report”是Exception Monitor一個很強悍的功能,看看它都能告訴我些什麼:

***********************************************************

* Exception Monitor Log Analyzer Report version 7.0.0.0

* Report Created from: f:Program FilesException Monitor 7.1inemlogs_5456-15335-719-2003.dbl

* Report Created on: July 20,2003 at 05:49 PM

* The following fault type was detected: Access Violation

* Exception Monitor 7.1.2195.5

* Log generated on: 2003-7-19 15:04:23

***********************************************************

 

The service faulted in thread # 15

 

The stack for the faulting thread follows.  Column 1 shows the Child EBP, Column 2 shows the Return Address, Column 3 shows the module called, and column 4 shows the resolved name if column 3 was not able to locate or use symbols.  To read the stack, start at the bottom and work your way up.  The function on the bottom called the function above it, which called the function above it, etc.

 

0000000000c6fce4  0000000077f58cca  ntdll!0x0000000077F83AED (No FPO)

0000000000c6fdb8  0000000077190729  ntdll!0x0000000077F58CCA (No FPO) 

0000000000000001  0000000000000000  ole32!0x0000000077190729 (No FPO)

 

*****

The following is extended information from the log:

00c6fcd8 : 00080000

00c6fcdc : 000e78a8

00c6fce0 : 00000000

00c6fce4 : 00c6fdb8

00c6fce8 : 77f58cca : C:WINDOWSSystem32 tdll.dll+0x8cca

00c6fcec : 00080000

……

!inetdbg.ds c6fd98 to dump next block

 ……………..

……………….

…………………..

…………..

 

由於沒有Windows SymbolsException Monitor並不能如願地告訴你崩潰到底發生在哪一個函式,雖然我們知道是NTDLL.DLL0x77f83aed指令。

 

 

W32dasm

NTDLL.DLL的“0x77f83aed”指令可能是什麼方面的函式呼叫呢?

我們用W32dasm載入了NTDLL.DLL,它會進行Disemble,我們可以看到輸出的函式,如下圖所示:

 

 

從指令地址來看,“0x77f83aed”指令似乎是RtlFreeHeap附近,總之都是涉及釋放堆疊。

 

COM+程式映像轉儲

Windows XPComponent Service提供了一種新功能“程式映像轉儲”。

程式轉儲工具概念

透過將 COM+ 應用失敗時的狀態轉儲到指定目錄中,程式轉儲工具允許管理員簡化開發人員除錯應用程式的任務。以下是失敗情況的例子:

  • 應用程式掛起並不再響應客戶端。
  • 應用程式導致了異常並被 COM+ 執行時終止。
  • 應用程式失敗。

在所有這些情況中,程式轉儲功能允許轉儲失敗時的整個程式狀態,啟用更為有效的應用程式失敗除錯。

這個設定針對某一個COM+應用,如下圖所示:

 

這樣,當Tomo_UM_X應用自動關閉時發生的崩潰,就會被COM+把程式映像轉儲到指定的目錄中,的檔名類似於:

{424102D6-D93F-42D8-98A4-E39ADDD8DD32}_2003_07_20_11_51_02.dmp

 

可以用Microsoft 開啟這個檔案,然後“啟動新例項”,就可以重現當時的情景,如下所示:

 

 

Disclaimers:

本文件所包含的資訊代表了在釋出之日,zhengyun對所討論問題的當前看法。本文件不應理解為zhengyun一方的承諾,zhengyun不保證所給資訊在釋出之日以後的準確性。

本文件僅供參考。

使用者必須遵守所有適用的版權法。在不對版權法所規定的權利加以限制的情況下,如未得到 zhengyunCSDN.Net明確的書面許可,不得出於任何目的、以任何形式或手段(電子的、機械的、影印、錄製等等)複製、傳播本文的任何部分,也不得將其儲存或引入到檢索中。

 

Written by zhengyun (at) tomosoft.com

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959566/,如需轉載,請註明出處,否則將追究法律責任。

相關文章