COM+物件池元件崩潰除錯手記 (轉)
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 Symbols,Exception Monitor並不能如願地告訴你崩潰到底發生在哪一個函式,雖然我們知道是NTDLL.DLL的0x77f83aed指令。
W32dasm
NTDLL.DLL的“0x77f83aed”指令可能是什麼方面的函式呼叫呢?
我們用W32dasm載入了NTDLL.DLL,它會進行Disemble,我們可以看到輸出的函式,如下圖所示:
從指令地址來看,“0x77f83aed”指令似乎是RtlFreeHeap附近,總之都是涉及釋放堆疊。
COM+程式映像轉儲
Windows XP的Component 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不保證所給資訊在釋出之日以後的準確性。
本文件僅供參考。
使用者必須遵守所有適用的版權法。在不對版權法所規定的權利加以限制的情況下,如未得到 zhengyun和CSDN.Net明確的書面許可,不得出於任何目的、以任何形式或手段(電子的、機械的、影印、錄製等等)複製、傳播本文的任何部分,也不得將其儲存或引入到檢索中。
Written by zhengyun (at) tomosoft.com
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959566/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【除錯技巧】Dialog dismiss 崩潰除錯
- 記一次VMware的崩潰除錯分析過程除錯
- vs2010除錯崩潰 reflector除錯
- WkWebView 令人崩潰的崩潰WebView
- 通過Webkit遠端除錯協議監聽網頁崩潰WebKit除錯協議網頁
- 幽蘭核心崩潰自救記
- 使用C#開發COM+元件 (轉)C#元件
- UIPasteboard UIMenuController 刪除崩潰問題UIASTController
- 【安卓筆記】崩潰日誌收集安卓筆記
- WKWebView崩潰WebView
- Redis崩潰Redis
- COM+元件啟動報錯問題處理元件
- Android 崩潰日誌採集元件-DhccCrashLibAndroid元件
- Crittercism:KitKat崩潰率0.7% iOS 7.1崩潰率1.6%iOS
- Linux崩潰恢復工具--CRK(轉)Linux
- APP防崩潰APP
- 除錯篇——除錯物件與除錯事件除錯物件事件
- iOS應用崩潰了,如何透過崩潰手機連線電腦查詢日誌方法iOS應用崩潰
- WWDC 2018:理解崩潰以及崩潰日誌
- C++記錄程式崩潰時的dumpfileC++
- Web站點崩潰的原因總結(轉)Web
- oracle sqr編寫除錯手記Oracle除錯
- iOS Crash不崩潰iOS
- linux mint 崩潰Linux
- ios 崩潰集錦iOS
- app 崩潰的原因APP
- 執行緒崩潰為什麼不會導致 JVM 崩潰執行緒JVM
- 使用AD+處理崩潰和掛起 (轉)
- 原位升級 拯救Windows XP崩潰的稻草(轉)Windows
- 案例解析:執行緒池使用不當導致的系統崩潰執行緒
- 華為手機使用 appium 截圖後,app 崩潰APP
- iOS系統app崩潰日誌手動符號化iOSAPP符號
- 華為手機6.0系統系列崩潰,情況未明
- Node出錯導致執行崩潰的解決方案
- IOS 崩潰日誌分析iOS
- Invalid double崩潰分析
- 基於Apache元件,分析物件池原理Apache元件物件
- 記一次Linux核心崩潰:kdump,crash,vmcoreLinux