上線中系統有 Bug 怎麼辦? 使用 IntelliTrace 收集上線環境診斷資料幫你抓蟲
各位夥伴們,
開發人員最頭痛就是除錯的時候,有時明明在自己的開發機器上運作一切正常無誤,但當將程式碼佈署到另一個測試環境、甚至是上線環境時就會有問題,這時候該如何除錯呢? 在 Visual Studio Ultimate 可以使用 IntelliTrace 功能,它是一個智慧除錯的工具,可以記錄和追蹤程式碼的執行歷程時,發生錯誤時可以讓你追蹤到引起錯誤的那一行程式碼, 您可以更輕鬆地找到 Bug 並修正,而不需要設定很多個中斷點跳來跳去。再來當上線環境發生錯誤時,如何在你的開發環境重現這個 Bug 發生時的情境好來除錯呢? IntelliTrace 就像是飛行記錄器,讓你重現發生問題那一刻的機器環境及程式執行狀況,重現 Bug 不是問題,下次當你的朋友/同事們說:「在我的電腦明明是好的啊?」你可以回「就讓 Visual Studio Ultimate 的 IntelliTrace 來幫你吧!」
第一次接觸 IntelliTrace 朋友,可先看本篇文章 - 在我的電腦明明是好的啊? 使用 IntelliTrace 重現 Bug 好除錯!
本文簡介在上線/生產環境 (Production) 中,使用 IntelliTrace 的作法,大家回去請試試!
「IntelliTrace 獨立收集器」可讓您收集生產伺服器或其他環境上應用程式的 IntelliTrace 診斷資料,而不需要在目標電腦上安裝 Visual Studio,而且不需要變更目標系統的環境。 IntelliTrace 獨立收集器適用於 Web、Sharepoint、WPF 和 Windows Forms 應用程式。 完成資料收集時,只要刪除收集器,就可以將其解除安裝。
觀看 IntelliTrace 實際操作:收集和分析生產環境中的 IntelliTrace 資料以進行偵錯 (Channel 9 影片)
需求
.NET Framework 3.5、4 或 4.5
在開發電腦或其他要開啟 .iTrace 檔案的電腦上已安裝 Visual Studio Ultimate 2013
注意事項: 請務必儲存符號 (.pdb) 檔案。 若要使用 IntelliTrace 進行偵錯並逐步執行程式碼,您必須具有相符的原始程式檔和符號檔。 請參閱 設定版本以便在部署後診斷問題。
常見問題集
哪些應用程式與收集器搭配使用?
裝載於 Internet Information Services (IIS) 7.0、7.5 和 8.0 版的 ASP.NET Web 應用程式
SharePoint 2010 和 SharePoint 2013 應用程式
Windows Presentation Foundation (WPF) 和 Windows Forms 應用程式。
如何開始?
安裝收集器
在應用程式伺服器上,建立收集器目錄,例如:C:\IntelliTraceCollector
從 Microsoft 下載中心或從 Visual Studio 2103 Update 3 安裝資料夾取得收集器。 下載 Update 3 for MicrosoftMicrosoft Visual Studio 2013:
Microsoft 下載中心:
在應用程式伺服器上,移至 IntelliTrace Collector for Visual Studio。
選擇 IntelliTraceCollector.exe 旁邊的 [下載]。
將 IntelliTraceCollector.exe 儲存至收集器目錄,例如:C:\IntelliTraceCollector
執行 IntelliTraceCollector.exe。 這會解壓縮 IntelliTraceCollection.cab 檔案。
-或-
Visual Studio 安裝資料夾:
從下列資料夾複製 IntelliTraceCollection.cab:
.. \Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\IntelliTrace\12.0.0
將 IntelliTraceCollection.cab 放入收集器目錄,例如:C:\IntelliTraceCollector
展開 IntelliTraceCollection.cab:
在應用程式伺服器上,以系統管理員身分開啟 [命令提示字元] 視窗。
瀏覽至收集器目錄,例如:C:\IntelliTraceCollector
使用 expand 命令 (結尾含句點 (.)),以展開 IntelliTraceCollection.cab:
展開 /f:* IntelliTraceCollection.cab。
注意事項: 句點 (.) 會保留含有當地語系化收集計劃的子資料夾。
設定收集器目錄的權限
在應用程式伺服器上,以系統管理員身分開啟 [命令提示字元] 視窗。
使用 Windows icacls 命令,授與伺服器管理員收集器目錄的完整權限。 例如:
icacls "C:\IntelliTraceCollector" /grant " <Domain\AdministratorID> ":F
收集 Web 應用程式或 SharePoint 應用程式的資料:
將收集器目錄的完整權限授與執行 IntelliTrace PowerShell Cmdlet 的人員。
例如:
icacls "C:\IntelliTraceCollector" /grant " <Domain\UserID> ":F
將收集器目錄的讀取和執行權限授與 Web 應用程式或 SharePoint 應用程式的應用程式集區。
例如:
針對 DefaultAppPool 應用程式集區中的 Web 應用程式:
icacls "C:\IntelliTraceCollector" /grant "IIS APPPOOL\DefaultAppPool":RX
針對 SharePoint - 80 應用程式集區中的 SharePoint 應用程式:
icacls "C:\IntelliTraceCollector" /grant "IIS APPPOOL\SharePoint - 80":RX
安裝 IntelliTrace PowerShell Cmdlet 以收集 Web 應用程式或 SharePoint 應用程式的資料
- 在應用程式伺服器上,確認已啟用 PowerShell。 在大部分的 Windows Server 版本上,您可以在 [伺服器管理員] 系統管理工具中加入這項功能。
安裝 IntelliTrace PowerShell Cmdlet。
以系統管理員身分開啟 [PowerShell 命令] 視窗。
依序選擇 [開始]、[所有程式]、[附屬應用程式] 和 [Windows PowerShell]。
選擇下列其中一個步驟:
在 64 位元作業系統上,開啟 Windows PowerShell 的捷徑功能表。 選擇 [以系統管理員身分執行]。
在 32 位元作業系統上,開啟 Windows PowerShell (x86) 的捷徑功能表。 選擇 [以系統管理員身分執行]。
在 [PowerShell 命令] 視窗中,使用 Import-Module 命令匯入 Microsoft.VisualStudio.IntelliTrace.PowerShell.dll。
例如:
Import-Module "C:\IntelliTraceCollector\Microsoft.VisualStudio.IntelliTrace.PowerShell.dll"
設定 .iTrace 檔案目錄的權限
- 在應用程式伺服器上,建立 .iTrace 檔案目錄,例如:C:\IntelliTraceLogFiles
注意事項:
若要避免讓應用程式變慢,請選擇本機高速磁碟上不是非常活躍的位置。
您可以將.iTrace 檔案和收集器檔案放在相同的位置。 不過,如果您有 Web 應用程式或 SharePoint 應用程式,請確認這個位置是在裝載應用程式的目錄外部。
安全性提示:
限制 iTrace 檔案目錄,僅供必須使用收集器的識別使用。 .ITrace 檔案可能包含機密資訊 (例如使用者、資料庫、其他來源位置和連接字串中的資料),因為 IntelliTrace 可以記錄傳遞給方法參數或做為傳回值的任何資料。
請確定可以開啟 .iTrace 檔案的人具有檢視機密資料的授權。 共用 .iTrace 檔案時請小心。 如果其他人必須具有存取權,請將檔案複製到安全的共用位置。
2. 針對 Web 應用程式或 SharePoint 應用程式,將 .iTrace 檔案目錄的完整權限授與其應用程式集區。 您可以使用 Windows icacls 命令,或使用 Windows 檔案總管 (或檔案總管)。
例如:
使用 Windows icacls 命令設定權限:
針對 DefaultAppPool 應用程式集區中的 Web 應用程式:
icacls "C:\IntelliTraceLogFiles" /grant "IIS APPPOOL\DefaultAppPool":F
針對 SharePoint - 80 應用程式集區中的 SharePoint 應用程式:
icacls "C:\IntelliTraceLogFiles" /grant "IIS APPPOOL\SharePoint - 80":F
-或-
使用 Windows 檔案總管 (或檔案總管) 設定權限:
開啟 .iTrace 檔案目錄的 [屬性]。
在 [安全性] 索引標籤上,依序選擇 [編輯] 和 [新增]。
請確認 [內建安全性主體] 出現在 [選取這個物件類型] 方塊中。 如果未出現,請選擇 [物件類型],以將它加入。
請確認您的本機電腦出現在 [從這個位置] 方塊中。 如果未出現,請選擇 [位置] 變更它。
在 [輸入要選取的物件名稱] 方塊中,加入 Web 應用程式或 SharePoint 應用程式的應用程式集區。
選擇 [檢查名稱] 來解析名稱。 選擇 [確定]。
請確認應用程式集區具有 [完全控制]。
從 Web 應用程式或 SharePoint 應用程式收集資料
- 若要開始收集資料,請以系統管理員身分開啟 [PowerShell 命令] 視窗,然後執行此命令:
Start-IntelliTraceCollection " <ApplicationPool> " <PathToCollectionPlan> <FullPathToITraceFileDirectory>
重要事項: 執行這個命令之後,請輸入 Y,確認您想要開始收集資料。
例如,從 SharePoint - 80 應用程式集區的 SharePoint 應用程式中收集資料:
Start-IntelliTraceCollection "SharePoint - 80" "C:\IntelliTraceCollector\collection_plan.ASP.NET.default.xml" "C:\IntelliTraceLogFiles"
應用程式集區 |
在其中執行應用程式的應用程式集區名稱 |
收集計劃的路徑 |
收集計劃 (可進行收集器設定的 .xml 檔案) 的路徑。 您可以指定收集器所隨附的計劃。 下列計劃適用於 Web 應用程式和 SharePoint 應用程式:
若要避免讓應用程式變慢,請自訂這些計劃,或建立自己的計劃。 基於安全考量,請將任何自訂計劃與收集器檔案放在相同的安全位置。 請參閱建立和自訂 IntelliTrace 收集計劃和 How can I get the most data without slowing down my app?。 注意事項 .iTrace 檔案的大小上限預設為 100 MB。 .iTrace 檔案達到這個限制時,收集器會刪除檔案的最早項目,以挪出空間供較新的項目使用。 若要變更此限制,請編輯收集計劃的 MaximumLogFileSize 屬性。我可以在哪裡找到這些收集計劃的當地語系化版本? 您可以在收集器的子資料夾中找到當地語系化計劃。 |
iTrace 檔案目錄的完整路徑 |
.iTrace 檔案目錄的完整路徑。 安全性提示: 提供完整路徑,而非相對路徑。 |
收集器會附加至應用程式集區,並開始收集資料。
我現在可以開啟 .iTrace 檔案嗎?不可以,在資料收集期間會鎖定檔案。
- 重現問題。
若要取得 .iTrace 檔案的快照,請使用此語法:
Checkpoint-IntelliTraceCollection " <ApplicationPool> "
- 若要檢查收集狀態,請使用此語法:
Get-IntelliTraceCollectionStatus
- 若要停止收集資料,請使用此語法:
Stop-IntelliTraceCollection " <ApplicationPool> "
重要事項: 執行這個命令之後,請輸入 Y,確認您想要停止收集資料。 否則,收集器可能會繼續收集資料、.iTrace 檔案會保留鎖定,或檔案可能未包含任何有用的資料。
從 Managed 應用程式收集資料
若要同時啟動應用程式並收集資料,請使用此語法:
<FullPathToIntelliTraceCollectorExecutable> \IntelliTraceSC.exe launch /cp: <PathToCollectionPlan> /f:<FullPathToITraceFileDirectoryAndFileName> <PathToAppExecutableFileAndFileName>
例如,從名稱為 MyApp 的應用程式收集資料:
C:\IntelliTraceCollector\IntelliTraceSC.exe launch /cp:"C:\IntelliTraceCollector\collection_plan.ASP.NET.default.xml" /f:"C:\IntelliTraceLogFiles\MyApp.itrace" "C:\MyApp\MyApp.exe"
收集器可執行檔 IntelliTrace 的完整路徑
收集器可執行檔 IntelliTraceSC.exe 的完整路徑
收集計劃的路徑
收集計劃 (可進行收集器設定的 .xml 檔案) 的路徑。
您可以指定收集器所隨附的計劃。 下列計劃適用於 Managed 應用程式:
collection_plan.ASP.NET.default.xml
僅收集 IntelliTrace 事件,包括例外狀況、資料庫呼叫和 Web 伺服器要求。
collection_plan.ASP.NET.trace.xml
收集函式呼叫和 collection_plan.ASP.NET.default.xml 中的所有資料。 這個計劃適用於進行詳細分析,但可能會讓應用程式變得比 collection_plan.ASP.NET.default.xml 更慢。
若要避免讓應用程式變慢,請自訂這些計劃,或建立自己的計劃。 基於安全考量,請將任何自訂計劃與收集器檔案放在相同的安全位置。 請參閱建立和自訂 IntelliTrace 收集計劃和 How can I get the most data without slowing down my app?。
注意事項 .iTrace 檔案的大小上限預設為 100 MB。 .iTrace 檔案達到這個限制時,收集器會刪除檔案的最早項目,以挪出空間供較新的項目使用。 若要變更此限制,請編輯收集計劃的 MaximumLogFileSize 屬性。我可以在哪裡找到這些收集計劃的當地語系化版本?
您可以在收集器的子資料夾中找到當地語系化計劃。
.iTrace 檔案目錄及檔案名稱的完整路徑
.iTrace 檔案目錄以及副檔名為 .itrace 之 .iTrace 檔案名稱的完整路徑。
安全性提示 提供完整路徑,而非相對路徑。應用程式可執行檔案及檔案名稱的完整路徑
Managed 應用程式的路徑和檔案名稱
結束應用程式,以停止資料收集。
在 Visual Studio Ultimate 中開啟 .iTrace 檔案
注意事項: 若要使用 IntelliTrace 進行偵錯並逐步執行程式碼,您必須具有相符的原始程式檔和符號檔。 請參閱 設定版本以便在部署後診斷問題。
移動 .iTrace 檔案,或將它複製到具有 Visual Studio Ultimate 的電腦。
在 Visual Studio 外部按兩下 .iTrace 檔案,或從 Visual Studio 內開啟該檔案。
Visual Studio 會顯示 [IntelliTrace 摘要] 頁面。 在大部分的區段中,您都可以檢閱事件或其他項目,並選擇一個項目,然後在發生事件的位置以及時間使用 IntelliTrace 開始偵錯。 請參閱 使用儲存的 IntelliTrace 資料偵錯應用程式。
注意事項: 若要使用 IntelliTrace 進行偵錯並逐步執行程式碼,您必須在開發電腦上具有相符的原始程式檔和符號檔。 請參閱 設定版本以便在部署後診斷問題。
如何取得大部分的資料,而不會讓應用程式變慢?
IntelliTrace 可以收集大量資料,因此對您應用程式效能的影響取決於 IntelliTrace 所收集的資料以及所分析的程式碼種類。 請參閱最佳化實際伺服器上的 IntelliTrace 收集。
以下是一些取得大部分資料而不會讓應用程式變慢的方法:
只有在您認為沒有問題或是可以重現問題時,才執行收集器。
開始收集,並重現問題,然後停止收集。 在 Visual Studio Ultimate 中開啟 .iTrace 檔案,並檢查資料。 請參閱在 Visual Studio Ultimate 中開啟 IntelliTrace 記錄檔。
針對 Web 應用程式和 SharePoint 應用程式,收集器會為每個共用指定應用程式集區的應用程式記錄資料。 這可能會讓任何共用相同應用程式集區的應用程式變慢,即使您只能在收集計劃中指定單一應用程式的模組也是一樣。
若要防止收集器讓其他應用程式變慢,請在它自己的應用程式集區中裝載每個應用程式。
檢閱 IntelliTrace 在收集計劃中為其收集資料的事件。 編輯收集計劃,以停用不相關或您不感興趣的事件。
若要停用事件,請將 <DiagnosticEventSpecification> 項目的 enabled 屬性設為 false:
<DiagnosticEventSpecification enabled="false">
如果 enabled 屬性不存在,表示已啟用事件。
這樣如何改善效能?
您可以停用與應用程式無關的事件,以減少啟動時間。 例如,針對未使用 Windows Workflow 的應用程式停用 Windows Workflow 事件。
您可以停用可存取登錄但未顯示登錄設定問題之應用程式的登錄事件,以改善啟動和執行階段效能。
檢閱 IntelliTrace 在收集計劃中為其收集資料的模組。 編輯收集計劃,使其只包括您感興趣的模組:
開啟收集計劃。 尋找 <ModuleList> 項目。
在 <ModuleList> 中,將 isExclusionList 屬性設為 false。
使用 <Name> 項目,即可指定每個具有下列其中一個項目的模組:檔案名稱、包括其名稱中含有該字串之任何模組的字串值,或公開金鑰。
例如,若只要收集 Fabrikam Fiber Web 應用程式之主要 Web 模組中的資料,請建立與下面類似的清單:
Xml
<ModuleList isExclusionList="false">
<Name>FabrikamFiber.Web.dll</Name>
</ModuleList>
若要從任何名稱中包括 "Fabrikam" 的模組中收集資料,請建立與下面類似的清單:
Xml
<ModuleList isExclusionList="false">
<Name>Fabrikam</Name>
</ModuleList>
若要透過指定模組的公開金鑰語彙基元,以從模組中收集資料,請建立與下面類似的清單:
Xml
<ModuleList isExclusionList="false">
<Name>PublicKeyToken:B77A5C561934E089</Name>
<Name>PublicKeyToken:B03F5F7F11D50A3A</Name>
<Name>PublicKeyToken:31BF3856AD364E35</Name>
<Name>PublicKeyToken:89845DCD8080CC91</Name>
<Name>PublicKeyToken:71E9BCE111E9429C</Name>
</ModuleList>
這樣如何改善效能?
這樣會減少 IntelliTrace 在啟動和執行應用程式時所收集的方法呼叫資訊量與其他檢測資料量。 這項資料可讓您:
在收集資料之後逐步執行程式碼。
檢查傳遞給函式呼叫的值以及從函式呼叫傳回的值。
為何不改為排除模組?
根據預設,收集計劃會透過將 isExclusionList 屬性設為 true 來排除模組。 不過,排除模組時收集到的資料,還是可能來自不符合清單準則的模組,以及您可能不感興趣的模組,例如協 力廠商或開放原始碼模組。
- 是否有任何 IntelliTrace 不會收集的資料?
是,為了降低對效能的影響,IntelliTrace 會限制只對下列值進行資料收集:傳遞給方法以及從方法傳回的基本資料類型值,以及傳遞給方法以及從方法傳回之最上層物件欄位中的基本 資料類型值。
例如,假設您有接受整數 id 和 Employee 物件 oldemployee 的 AlterEmployee 方法簽章:
public Employee AlterEmployee(int id, Employee oldemployee)
Employee 類型具有下列屬性:Id、Name 和 HomeAddress。 Employee 與 Address 類型之間具有關聯。
收集器會記錄 AlterEmployee 方法所傳回 id、Employee.Id、Employee.Name 和 Employee 物件的值。 不過,收集器不會記錄 Address 物件的資訊,不論此物件是否為 Null。 收集器也不會記錄 AlterEmployee 方法中區域變數的資料,除非其他方法使用這些區域變數做為參數 (當時記錄為方法參數)。
我還可以在哪裏取得 IntelliTrace 資料?
從 Visual Studio Ultimate 中的 IntelliTrace 偵錯工作階段,查看 偵錯時使用 IntelliTrace 錄製程式碼執行。
從 Microsoft Test Manager 中的測試工作階段,查看 如何:收集 IntelliTrace 資料以協助偵錯困難的問題。