系統上線後我們心中的痛!!找出 Production上有問題的程式碼–IntelliTrace Collector
我們的壓力很大
我們花了很多的時間做 需求訪談和確認、程式撰寫和除錯,就連上線測試和教育練訓也都是由我們自已一手包辦。
上線後使用者就會這麼輕易地放過我們嗎?不!並沒有!接下來還會有一連串的需求變更和系統除錯等著我們。
明明我們都已經自行測試了幾百次,但交到使用者手上時就是莫名其妙地掛掉。
發生了幾次後使用者打電話來我們部門抱怨!但我們就是當下沒有辦法立即解決…
明明就有寫 Log 記錄,但最關鍵的是那一行出錯?傳出傳入的參數?就是不知道 。使用者怎麼發生的bug也講得不清不楚的…
過了幾天後,就換長官一天到晚接客戶抱怨的電話…
老闆的壓力來了…我們的日子也跟著不好過。
老闆最後下了通緝令…「今天沒有修好就不準下班…」
所以我們又只好乖乖地設中斷點一個一個把有可能發生問題的地方翻出來查了
過了幾天我們的結論是
「能直接在 proudction 上直接搜集到程式中「所有」發生的歷程該有多好」
有那些類型的可以做?可以收集到什麼?
IntelliTrace on production 這個套件可以支援
- Web
- Windows Application
可以收集到的項目
若是連同 Data 都收集的話,所有 In / Out 的變數都可以看到
如何取得安裝套件
取得的方法有三種
一、通常可以請 Production Owner ( MIS ) 到下面的連結下載 IntelliTrace Collector for Visual Studio
http://www.microsoft.com/visualstudio/cht/downloads#intellitrace-collector
二、或是直接在有安裝 Visual Studio 2012 Ultimate 的電腦上直接 Copy IntelliTraceCollection.CAB 這個檔案
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace\11.0.0
最後一個則是可以直接在 MSDN 中下載得到
安裝與設定套件
這個套件是隸屬於 Visual Studio 2012 Ultimate 之下的,所以不會有額外費用的產生
首先建立了兩個資料夾 ( 名稱可以自行更換 )
並將 IntelliTraceCollection.cab 放在 c:\IntelliTrace
在 Command Line 中「expand /f:* IntelliTraceCollection.cab .」
最後那個「點」就是代表要解壓縮到目前的路徑
接下來我們就要將剛剛的兩個資料夾的權限指定給的 Application Pool
「icacls "c:\IntelliTrace" /grant "IIS APPPOOL\DefaultAppPool":RX」
在這裡建議您,建立一個新的 Application Pool 專屬給 IntelliTrace 使用
指令完成後,就可以在 IntelliTrace 的資料中的安全性中看到使用者多了「DefaultAppPool」
請記得將權限開啟成「完全控制」
接著對第二個資料夾 c:\IntelliTraceLogs 設定權限
「icacls c:\IntelliTraceLogs /grant “IIS APPPOOL\DefaultAppPool”:F」
一樣回到檔案總管將權限開啟
啟用 IntelliTrace PowerShell
接下來要用 Power Shell 啟動,請確認一下是否有安裝 PowerShell 整合指令碼環境 ISE
在 PowerShell 中輸入 記得用 Administrator 啟動
只要重新載入 power shell 就要重新載入
「Import-Module C:\IntelliTrace\Microsoft.VisualStudio.IntelliTrace.PowerShell.dll」
將 IntelliTrace 的 Power Shell 載入後,再下 Get-Command 就可以很方便載入 IntelliTrace 相關的指令 ( 支援 TAB )
「Get-Command *IntelliTrace*」
若想要知道每個指令的用法可以用 Get-Help 「Get-Help Start-IntelliTraceCollection」
正式啟用 IntelliTrace
在套件中會有兩個 Collection Plan 檔,若是想要更進階看到所有執行的歷程和變數值的話,請選 Trace 的 Plan
「Start-IntelliTraceCollection DefaultAppPool C:\IntelliTrace\collection_plan.ASP.NET.trace.xml c:\IntelliTraceLogs」
想要知道目前 IntelliTrace 追蹤的計劃和收集的目錄,可以用 「Get-IntelliTraceCollectionStatus –ApplicationPool DefaultAppPool」
執行網站前,可以看到 output path 還是空的
Production 發生錯誤時
接著就是重頭戲了!開啟我們的網站
操作到一半就發生錯誤的畫面,這個時候想要 Cut 個圖給開發團隊,都覺得沒啥幫助 Orz
而且這個錯誤是無預警在任何一個頁面就會掛掉,所以只能跟開發團隊講說 「偶爾用到一半就會掛掉」
這個時候 IntelliTraceLogs 目錄,就會產生 Log 檔 ( 只要有被執行就會被記錄 )
開始分析 IntelliTrace Log
直接將此檔案拿到有 Visual Studio 2012 Ultimate 的機器上開啟,可以看到工具會第一個列出剛剛收集到所有的 Error Exception
點選其中一個 Exception 還會列出 Call Stack
這時馬上發現是因為 Connection Open 出錯
左邊的項目是 IntelliTrace Icon ,可以點開來看到呼叫的來龍去脈。從這裡就可以發現 CreateConnection 是由下面的 CreateCommand 所呼叫,在左邊也會出現呼叫的 ICON
點選一下上面的 ICON ,就會返回到 CreateCommand
而且在 Locals 視窗中就會出現 CreateCommand 和 CreateConnection 這兩個 Method 中所有的變數值
從這裡馬上就可以發現,程式在開啟 Connection 時沒有做好資料釋放的動作而造成 Memory Leak ,在 Connection String 又沒有設定 Connection Pool 數量。
所以只要連線數一超過 25 個,就會發生這個 Connection Pool Exception 。
其他分析的項目
當然除了 Exception 外,還有 Web Request 可以查詢目前有執行那些內容
可以看到連 ADO.NET 中所有被執行的 SQL 語法都會被列出來
關閉收集的項目
若是找到錯誤的話,就可以請系統管理人員將 IntelliTrace 的功能關閉 「Stop-IntelliTraceCollection DefaultAppPool」
有了這個就不用再擔心 Production 發生任何錯誤,我們都一無所知…
希望這個可以讓 長官 和 開發團隊 能在更短的時間內解決和釐清程式的問題
系統需求
必須要 IIS 7 以上的版本
.NET Framework 2 以上
若是想要看到程式碼的來龍去脈的話,就必須要有 PDB 檔。
參考資料
Collect IntelliTrace Data Outside Visual Studio with the Standalone Collector
http://msdn.microsoft.com/en-us/library/vstudio/hh398365.aspx