共用方式為


追蹤和檢測應用程式

備註

本文專屬於 .NET Framework。 它不適用於較新的 .NET 實作,包括 .NET 6 和更新版本。

追蹤是一種在應用程式執行時監控其操作的方式。 您可以在開發 .NET Framework 應用程式時,將追蹤和偵錯檢測新增至 .NET Framework 應用程式,而且您可以在開發應用程式時和部署后使用該檢測。 您可以使用 System.Diagnostics.TraceSystem.Diagnostics.DebugSystem.Diagnostics.TraceSource 類別,在記錄檔、文本檔或其他裝置中記錄錯誤和應用程式執行的相關信息,以供稍後分析。

「檢測」一詞是指監視或測量產品效能層級及診斷錯誤的能力。 在程式設計中,這表示應用程式能夠納入:

  • 程式代碼追蹤 - 在運行時間接收應用程式執行的相關信息訊息。

  • 除錯 - 在開發中的應用程式中追蹤並修正程式錯誤。 如需詳細資訊,請參閱 偵錯

  • 性能計數器 - 可讓您追蹤應用程式效能的元件。 如需相關資訊,請參閱 Performance Counters

  • 事件記錄 檔 - 可讓您在應用程式執行中接收和追蹤主要事件的元件。 如需詳細資訊,請參閱 EventLog 類別。

藉由將追蹤語句放在程式碼中的戰略位置來檢測應用程式,對於分散式應用程式特別有用。 藉由使用追蹤語句,您可以檢測應用程式,不僅可在發生問題時顯示資訊,還可以監視應用程式的執行程度。

類別 TraceSource 提供增強的追蹤功能,並可用來取代舊 Trace 版和 Debug 追蹤類別的靜態方法。 熟悉的 TraceDebug 類別仍然被廣泛使用,但建議針對新的追蹤命令,例如 TraceSourceTraceEvent,使用 TraceData 類別。

TraceDebug類別完全相同,唯一的不同是Trace類別的程序和函式預設會編譯到發佈版本中,而Debug類別的程序和函式則不會。

TraceDebug 類別提供在開發期間或部署之後監視和檢查應用程式效能的方法。 例如,您可以使用 類別 Trace 來追蹤所部署應用程式中的特定動作類型,例如建立新的資料庫連線,因此可以監視應用程式的效率。

程式代碼追蹤和偵錯

在開發期間,您可以使用 類別的 Debug 輸出方法,在Visual Studio整合開發環境的 [輸出] 視窗中顯示訊息(IDE)。 例如:

Trace.WriteLine("Hello World!")
Debug.WriteLine("Hello World!")
System.Diagnostics.Trace.WriteLine("Hello World!");
System.Diagnostics.Debug.WriteLine("Hello World!");

這些範例會在調試程式中執行應用程式時,在 [輸出] 視窗中顯示 “Hello World!” 。

這可讓您根據應用程式在測試環境中的行為來偵錯應用程式並優化其效能。 您可以在偵錯組建中偵錯應用程式,並 Debug 開啟條件屬性,以接收所有偵錯輸出。 當您的應用程式準備好發行時,您可以編譯發行組建,而不開啟 Debug 條件屬性,讓編譯程式不會在最終可執行檔中包含偵錯程序代碼。 如需詳細資訊,請參閱 如何:使用追蹤和偵錯有條件地編譯。 如需應用程式不同組建組態的詳細資訊,請參閱 編譯和建置。

您也可以使用 類別的方法 Trace ,追蹤已安裝應用程式中的程式代碼執行。 將追蹤開關放在您的程式碼中,您可以控制是否執行追蹤及其範圍。 這可讓您監視生產環境中應用程式的狀態。 這在商務應用程式中特別重要,該應用程式使用在多部計算機上執行的多個元件。 您可以透過配置檔案來控制部署後的開關使用方式。 如需詳細資訊,請參閱 如何:建立、初始化及設定追蹤開關

當您開發想要使用追蹤的應用程式時,通常會在應用程式程式代碼中包含追蹤和偵錯訊息。 當您準備好部署應用程式時,您可以編譯發行組建,而不需要 開啟偵錯 條件屬性。 不過,您可以開啟 Trace 條件屬性,讓編譯程式在可執行檔中包含追蹤程式代碼。 如需詳細資訊,請參閱 如何:使用追蹤和偵錯有條件地編譯

程式代碼追蹤的階段

程式代碼追蹤有三個階段:

  1. 儀器化 - 您會將追蹤程式代碼新增至應用程式。

  2. 追蹤 - 追蹤程式代碼會將資訊寫入指定的目標。

  3. 分析 - 您評估追蹤資訊,以識別並瞭解應用程式中的問題。

在開發期間,所有偵錯和追蹤輸出方法默認都會將資訊寫入 Visual Studio 中的 [輸出] 視窗。 在已部署的應用程式中,方法會將追蹤資訊寫入您指定的目標。 如需指定追蹤或偵錯輸出目標的詳細資訊,請參閱 追蹤接聽程式

以下是使用追蹤來分析和更正已部署應用程式中潛在問題的主要步驟的整體檢視。 如需如何執行這些步驟的詳細資訊,請參閱適當的連結。

在應用程式中使用追蹤
  1. 請考慮部署應用程式之後,您想要在現場接收的追蹤輸出。

  2. 建立一組開關。 如需詳細資訊,請參閱如何設定追蹤開關

  3. 將追蹤語句新增至應用程式程序代碼。

  4. 決定您想要追蹤輸出出現在何處,並新增適當的接聽程式。 如需詳細資訊,請參閱 建立和初始化追蹤接聽程式

  5. 測試和偵錯您的應用程式及其所包含的追蹤程序代碼。

  6. 使用下列其中一個程式,將應用程式編譯為可執行的程式代碼:

    • 使用 建置 功能表以及 方案總管屬性頁面 對話框的 偵錯 頁面。 在 Visual Studio 中編譯時,請使用此專案。

      (或)

    • 針對編譯的命令行方法,使用 TraceDebug 編譯程式指示詞。 如需詳細資訊,請參閱 使用追蹤和偵錯有條件地編譯。 從命令行進行編譯時,請使用此選項。

  7. 如果在執行時發生問題,請開啟適當的追蹤開關。 如需詳細資訊,請參閱 設定追蹤參數

    追蹤程式代碼會將追蹤訊息寫入指定的目標,例如畫面、文本檔或事件記錄檔。 您在 Trace.Listeners 集合中包含的監聽程式類型會決定目標。

  8. 分析追蹤訊息,以識別並瞭解應用程式中的問題。

追蹤工具與分散式應用程式

當您建立分散式應用程式時,可能會發現很難以實際使用的方式進行測試。 很少有開發小組能夠測試作系統或網頁瀏覽器的所有可能組合(包括所有本地化的語言選項),或模擬大量用戶同時存取應用程式。 在這些情況下,您無法測試分散式應用程式如何回應大量、不同的設定,以及唯一的用戶行為。 此外,分散式應用程式的許多部分都沒有使用者介面,因此您無法直接互動或檢視這些部分的活動。

不過,您可以藉由讓分散式應用程式向系統管理員描述某些感興趣的事件,尤其是出錯的事情,透過增加程式檢測功能來彌補這一點,也就是將追蹤語句放在程式碼中的戰略位置。 然後,如果在運行時間發生意外的情況(例如,響應時間過慢),您可以判斷可能的原因。

透過追蹤語句,您可以避免檢查原始程式碼、修改程式碼、重新編譯,以及在偵錯環境中嘗試產生運行時錯誤等困難工作。 請記住,您可以檢測應用程式不僅顯示錯誤,還可以監視效能。

追蹤語句的戰略放置

在放置追蹤語句以供運行時間使用時,您必須特別小心。 您必須考慮部署的應用程式中可能需要哪些追蹤資訊,以便充分涵蓋所有可能追蹤的案例。 不過,由於使用追蹤的應用程式差異很大,因此沒有關於如何策略性放置追蹤的一般指導方針。 如需放置追蹤語句的詳細資訊,請參閱 如何:將追蹤語句新增至應用程式程序代碼

追蹤結果輸出

追蹤輸出是由稱為 接聽程序的物件所收集。 接聽程式是接收追蹤輸出並將它寫入輸出裝置的物件(通常是視窗、記錄檔或文本檔)。 建立追蹤接聽程式時,通常會新增至 Trace.Listeners 集合,讓接聽程式能夠接收所有追蹤輸出。

追蹤資訊一律至少寫入預設Trace輸出目標 , 。DefaultTraceListener 如果您因為某些原因而刪除 , DefaultTraceListener 而未將任何其他接聽程式新增至 Listeners 集合,則不會收到任何追蹤訊息。 如需詳細資訊,請參閱 追蹤接聽程式

下表列出寫入追蹤資訊的六個Debug成員和Trace方法。

方法 輸出
Assert 指定的文本;若未指定,則使用呼叫堆疊。 只有在語句中 Assert 指定為自變數的條件為 false 時,才會寫入輸出。
Fail 指定的文本;若未指定,則使用呼叫堆疊。
Write 指定的文字。
WriteIf 如果滿足 WriteIf 語句中指定為參數的條件,則顯示指定的文字。
WriteLine 指定的文字和回車符。
WriteLineIf 如果語句中 WriteLineIf 指定的條件作為引數得到滿足,則返回指定的文字和回車字元。

集合中的所有 Listeners 接聽程式都會接收上表所述的訊息,但所採取的動作可能會因接聽程式接收訊息的類型而有所不同。 例如,DefaultTraceListener在收到Fail或失敗的Assert通知時會顯示判斷提示對話方塊,但TextWriterTraceListener只會將輸出寫入其數據流。

您可以實作自己的接聽程式來產生自定義結果。 例如,自定義追蹤接聽程式可能會向消息框顯示訊息,或連接到資料庫以將訊息新增至數據表。 所有自定義接聽程式都應該支援上述六種方法。 如需建立由開發人員定義的接聽程式的詳細資訊,請參閱 TraceListener .NET Framework 參考。

WriteWriteLine 方法一律會撰寫您指定的文字。 AssertWriteIfWriteLineIf需要布林參數來控制是否寫入指定的文字;只有當表達式對於WriteIfWriteLineIf,或對於Assert時,才會寫入指定的文字。 方法 Fail 一律會寫入指定的文字。 如需詳細資訊,請參閱 如何:將追蹤語句新增至應用程式程序代碼 和 .NET Framework 參考。

安全性考慮

如果您未在部署 ASP.NET 應用程式之前停用追蹤和偵錯,您的應用程式可能會顯示惡意程式可能惡意探索之本身的相關信息。 如需詳細資訊,請參閱 如何:有條件地使用追蹤與偵錯進行編譯編譯和建置,以及如何:建立、初始化及配置追蹤參數。 偵錯也可以透過 Internet Information Services (IIS) 進行設定。

另請參閱