2009年2月10日

如何分析 MSDTC Trace Log (Windows SDK: tracefmt.exe Utility)

咳咳,今天要紀錄的是如何分析 MSDTC Trace Log,MSDTC 這東西真的是很難馴服,
雖然已經整理出一套設定方式(這篇是 Google「MSDTC」第一頁的最後一筆耶!)
但是 MSDTC 的可怕之處不在於「不會通」,而是「有時候通,有時候不會通」,
而且由於全世界受 MSDTC 之苦的前輩們長久下來累積了豐富的 troubleshooting 資料,因此當不同客戶的環境中 MSDTC 出現問題時,用該客戶環境當作關鍵字去搜尋解答,
往往每次都會得到不同的答案!Darkthread 是個尋找 MSDTC 疑難排解的好地方)
例如,在「日文 XP SP1 + MS A 產品 + Oracle DB」或是「英文 Win2k3 SP2 + IE6」,
或者「中文 Win2k3 SP1 + IE7 + Office 2003 + MS Project 2007」等等的環境因素,
綜合起來可能就會導致 MSDTC 產生不同的異常狀況!導致真正的原因始終搞不清楚 Orz
所以,有時候還是得分析 MSDTC 的 Trace Log,以檢視一段時間內 MSDTC 服務運作的狀況(MSDTC.LOG / DTCAXTM.LOG 是 MSDTC 內部使用的,沒辦法用來分析)。

首先要啟用 MSDTC Trace,設定方法請參考 Microsoft KB ,還蠻簡單的,
要注意的地方是開啟 Trace 會造成系統效能下降(運氣不好的話還會嚴重下降),
所以 Debug 完畢後請務必把 Trace 關閉,以免影響 Production 環境的系統效能。
(預設應該是停用 Trace 的,但我發現我使用的好幾台 VM 都已經有開啟 Trace 了,應該沒有特別去設定,感覺預設應該是啟用@@”)


設定好 Enable Trace 之後,在 Windows 2003 上看起來應該會類似這樣:
MSDTC_Trace_Win2k3

在 Windows 2008 上看起來則是這樣(跟設定的時候一樣,元件服務的內容有變):
MSDTC_Trace_Win2k8

Update: 發布前一個手滑就抓了 Win7 (Build 7000) 的圖(正式版應該也差不多):
MSDTC_Trace_Win7(Build 7000)

看起來果然是預設會 Trace Aborted & Long-Lived Transactions.
之後就繼續執行系統正常的操作,過一段時間再去檢查位於「C:\WINDOWS\system32\MsDtc\Trace」下的 Log 即可,檔名應該叫做「dtctrace.log / tracetx.log」。

好不容易叫 MSDTC 老老實實的記錄下來它到底都幹了甚麼好事之後,由於 log 是 binary 的格式,因此肉眼是無法閱讀的,這時候就輪到「tracefmt.exe」工具上場了!
「tracefmt.exe」是 Windows SDK提供的一個 Utility,
顧名思義應該是要將 Windows 內部使用的一些 binary log 重新 format 為人可以閱讀的格式,以 MSDTC Trace Log 來講就會被轉換為 csv 格式。

很不幸的,網路上似乎很難直接找到 tracefmt.exe 的下載點(其實就算找到也感覺蠻恐怖的,執行檔不知道會不會有病毒之類的),因此必須先下載完整的 Windows SDK 安裝檔,
官方下載點在這裡,稍微看了一下說明文件後會發現,這個 Windows SDK 版本可支援 Win XP、Vista、2003、2008(事實上 Win2003 SDK 的下載頁面也會導向這裡),大小約 1.3G, 若不想要裝一大堆有的沒的,只要選擇安裝「Development Tool」即可。

接下來依序執行以下步驟:
  1. 將 tracefmt.exe 從 {Windows SDK Folder}\bin 下複製到 Trace Log 所在的目錄中。
    並確認除目錄中除了 dtctrace.log 外,必須要有「msdtctr.mof」和「msdtcvtr.bat」兩個檔案。
    (.mof 要幹嘛我不太清楚,msdtcvtr.bat 內含呼叫 tracefmt.exe 執行 format 的 vb script)
  2. 在 Command Line 模式中,執行「msdtcvtr.bat -tracelog tracetx.log」,最後一個參數請換成 log 檔的檔名。
    (執行過程中產生的錯誤會紀錄在「errortrace.txt」中 <-- 所以我才知道沒有 msdtcctr.mof 就跑不下去)
  3. 執行完畢後 Windows 會自動用 notepad 打開 tracefmt.exe 產生的 trace.csv,此檔案中的內容就是 Trace 過程中紀錄到的各種 event,接下來就可以根據 event 的內容開始分析了。若檔案內容一片空白表示沒有紀錄到任何 event。
    (既然是 csv 格式,有需要的話也可以用 excel 開起來作進一步處理)
  4. 除了 trace.csv 檔案外,還會另外產生一個 errortrace.txt 說明檔,內有一些統計資料。不管你把「dtctrace.log」、「msdtctr.mof」、「msdtcvtr.bat」、「tracefmt.exe」複製到哪個資料夾執行,「trace.csv」和「errortrace.txt」的預設位置都會在:C:\WINDOWS\system32\MsDtc\Trace
    (應該可以透過 tracefmt.exe 指定輸出位置,不過這也不太重要…)
以上就是完整的步驟啦,最後補上一張完整的抓圖:
MSDTC_LogParse

2 則留言:

坎尼 提到...

WDK 是 Windows Driver Kit 吧
(剛剛在整理MSDN的光碟時碰巧看到)

Unknown 提到...

hmm ... 感謝砍泥的指正,我不知道為甚麼會有 Windows SDK = WDK 這種奇怪的認知 ... Orz 現在已經調整完畢囉!

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D