使用 Visual Studio 中的追蹤點將資訊記錄至 [輸出] 視窗
追蹤點可讓您在不需修改或停止程式碼的情況下,在可設定的條件下將資訊記錄至 [輸出] 視窗。 受控語言 (C#、Visual Basic、F#) 和原生程式碼以及 JavaScript 和 Python 之類的語言,都支援此功能。
注意
如需使用 .NET API 以程式設計方式將資訊記錄至 [輸出] 視窗的詳細資訊,請參閱將訊息傳送至輸出視窗。
讓我們以範例來說明
下列範例程式是一個簡單的 for
迴圈,其計數器變數會在每次迴圈執行另一個反覆項目時增加一。
下列範例程式是一個簡單的 for
迴圈,其計數器變數會在每次迴圈執行另一個反覆項目時增加一。
using System.Diagnostics;
namespace Tracepoints
{
public class Program
{
public static void Main(string[] args)
{
int counter = 0;
for (int i=0; i<=10; i++)
{
counter +=1;
}
}
}
}
在原始程式碼中設定追蹤點
您可以在 [中斷點設定] 視窗中,指定 [動作] 核取方塊下的輸出字串來設定追蹤點。
若要初始化追蹤點,請先按一下要設定追蹤點之行號左邊的裝訂邊。
將滑鼠停留在紅色圓圈上,然後按一下齒輪圖示。
此動作會開啟 [中斷點設定] 視窗。
選取 [動作] 核取方塊。
請注意紅色圓圈如何變更為菱形,指出您已從中斷點切換到追蹤點。
將您要記錄的訊息輸入到 [在輸出視窗中顯示訊息] 文字輸入框 (如需詳細資訊,請參閱本文稍後的章節)。
您的追蹤點現在已設定。 如果您只想將一些資訊記錄到輸出視窗,請點選 [關閉] 按鈕。
如果您想要新增條件來決定是否顯示訊息,請選取 [條件] 核取方塊。
您有三種條件選擇:條件運算式、篩選以及叫用次數。
您可以在 [中斷點設定] 視窗中,指定 [動作] 核取方塊下的輸出字串來設定追蹤點。
若要初始化追蹤點,請先按一下要設定追蹤點之行號左邊的裝訂邊。
將滑鼠停留在紅色圓圈上,然後按一下齒輪圖示,以開啟 [中斷點設定] 視窗。
選取 [動作] 核取方塊。
請注意紅色圓圈如何變更為菱形,指出您已從中斷點切換到追蹤點。
將您要記錄的訊息輸入到 [在輸出視窗中顯示訊息] 文字輸入框 (如需詳細資訊,請參閱本文稍後的章節)。
您的追蹤點現在已設定。 如果您只想將一些資訊記錄到輸出視窗,請點選 [關閉] 按鈕。
如果您想要新增條件來決定是否顯示訊息,請選取 [條件] 核取方塊。
您有三種條件選擇:條件運算式、篩選以及叫用次數。
動作功能表
此功能表可讓您將訊息記錄至 [輸出] 視窗。 將您想要輸出的字串輸入到訊息方塊中 (不需要引號)。 如果您想要顯示變數的值,請務必以大括弧將其括住。
例如,如果您想要在輸出主控台中顯示 counter
變數的值,請在訊息文字輸入框中輸入 {counter}。
如果您按一下 [關閉] 然後偵錯程式 (F5),您會在 [輸出] 視窗中看到下列輸出。
您也可以使用特殊關鍵字來顯示更具體的資訊。 確實如下所示輸入關鍵字 (在每個關鍵字和關鍵字本身的大寫字前面使用 "$")。
關鍵字 | 顯示的內容 |
---|---|
$ADDRESS | 目前指令 |
$CALLER | 呼叫函式名稱 |
$CALLSTACK | 呼叫堆疊 |
$FUNCTION | 目前的函式名稱 |
$PID | Process ID |
$PNAME | 程序名稱。 |
$TID | 執行緒識別碼 |
$TNAME | 執行緒名稱 |
$TICK | 滴答計數 (來自 Windows GetTickCount) |
此功能表可讓您將訊息記錄至 [輸出] 視窗。 將您想要輸出的字串輸入到訊息方塊中 (不需要引號)。 如果您想要顯示變數的值,請務必以大括弧將其括住。
例如,如果您想要在輸出主控台中顯示 counter
變數的值,請在訊息文字輸入框中輸入 {counter}
。
如果您按一下 [關閉] 然後偵錯程式 (F5),您會在 [輸出] 視窗中看到下列輸出。
您也可以使用特殊關鍵字來顯示更具體的資訊。 確實如下所示輸入關鍵字 (在每個關鍵字和關鍵字本身的大寫字前面使用 "$")。
關鍵字 | 顯示的內容 |
---|---|
$ADDRESS |
目前指令 |
$CALLER |
呼叫函式名稱 |
$CALLSTACK |
呼叫堆疊 |
$FUNCTION |
目前的函式名稱 |
$PID |
Process ID |
$PNAME |
程序名稱。 |
$TID |
執行緒識別碼 |
$TNAME |
執行緒名稱 |
$TICK |
滴答計數 (來自 Windows GetTickCount) |
條件功能表
條件可讓您篩選輸出訊息,因此訊息只會在特定案例下顯示。 有三種主要的條件可供您使用。
條件運算式
針對條件運算式,只有在符合特定條件時,才會顯示輸出訊息。
針對條件運算式,您可以在特定條件為 true 或變更時,將追蹤點設定為輸出訊息。 例如,如果您只想在 for
迴圈的反覆項目期間顯示計數器的值,則可以選取 [為 true] 選項,然後在訊息文字輸入框中輸入 i%2 == 0
。
如果您想要在 for
迴圈反覆項目變更時列印計數器的值,請選取 [變更時] 選項,然後在訊息文字輸入框中輸入 i
。
[變更時] 選項的行為,會隨不同的程式設計語言而異。
- 針對原生程式碼,偵錯工具不會將第一次條件評估視為變更,因此不會在第一次評估時叫用追蹤點。
- 針對受控程式碼,偵錯工具會在選取 [變更時] 之後,於第一個評估中叫用追蹤點。
如需在設定條件時可以使用的有效運算式,請參閱偵錯工具中的運算式。
針對條件運算式,只有在符合特定條件時,才會顯示輸出訊息。
針對條件運算式,您可以在特定條件為 true 或變更時,將追蹤點設定為輸出訊息。 例如,如果您只想在 for
迴圈的反覆項目期間顯示計數器的值,則可以選取 [為 true] 選項,然後在訊息文字輸入框中輸入 i%2 == 0
。
如果您想要在 for
迴圈反覆項目變更時列印計數器的值,請選取 [變更時] 選項,然後在訊息文字輸入框中輸入 i
。
[變更時] 選項的行為,會隨不同的程式設計語言而異。
- 針對原生程式碼,偵錯工具不會將第一次條件評估視為變更,因此不會在第一次評估時叫用追蹤點。
- 針對受控程式碼,偵錯工具會在選取 [變更時] 之後,於第一個評估中叫用追蹤點。
您也可以將中斷點插入程式碼的任何特定區段,然後選取 [中斷點設定] 功能表中的 [只有在叫用下列中斷點時啟用:] 核取方塊,來設定啟用追蹤點的條件。 您可以從選項清單中選擇任何中斷點。
如需在設定條件時可以使用的有效運算式,請參閱偵錯工具中的運算式。
叫用次數
叫用次數條件可讓您只在設定追蹤點的程式碼執行指定的次數之後,才會傳送輸出。
針對叫用次數,您可以選擇在設定追蹤點的程式碼已執行特定次數時輸出訊息。 根據需求,可以等於或為倍數,或者大於或等於指定的叫用次數值。 選擇最符合您需求的選項,並在欄位中輸入整數值 (例如 5),代表感興趣的反覆項目。
叫用次數條件可讓您只在設定追蹤點的程式碼執行指定的次數之後,才會傳送輸出。
針對叫用次數,您可以選擇在設定追蹤點的程式碼已執行特定次數時輸出訊息。 根據需求,可以等於或為倍數,或者大於或等於指定的叫用次數值。 選擇最符合您需求的選項,並在欄位中輸入整數值 (例如 5),代表感興趣的反覆項目。
您也可以藉由啟用 [叫用之後移除中斷點] 核取方塊,來移除第一次叫用的中斷點。
篩選器
針對篩選條件,指定針對哪些裝置、程序或執行緒輸出顯示。
篩選條件運算式的清單:
- MachineName = "名稱"
- ProcessId = 值
- ProcessName ="名稱"
- ThreadId = 值
- ThreadName = "名稱"
以雙引號括住字串 (例如名稱)。 可以不加上引號來輸入值。 您可以使用以下項目來結合子句:&
(AND
)、||
(OR
)、!
(NOT
) 和括號。
針對篩選條件,指定針對哪些裝置、程序或執行緒輸出顯示。
篩選條件運算式的清單:
MachineName
= "name"ProcessId
= valueProcessName
= "name"ThreadId
= valueThreadName
= "name"
以雙引號括住字串 (例如名稱)。 可以不加上引號來輸入值。 您可以使用以下項目來結合子句:&
(AND
)、||
(OR
)、!
(NOT
) 和括號。
考量因素
追蹤點的目的是讓偵錯更簡潔,且有更順暢的體驗。 使用追蹤點時,您應該注意一些考量。
有時候當您檢查物件的屬性 (Property) 或屬性 (Attribute) 時,其值可能會變更。 如果值在檢查期間變更,則不是追蹤點功能本身所造成的錯誤 (bug)。 不過,使用追蹤點來檢查物件並無法避免這些意外的修改。
運算式在 [動作] 訊息方塊中評估的方式可能與您目前用於開發的語言不同。 例如,若要輸出字串,即使您通常使用 Debug.WriteLine()
或 console.log()
,也不需要以引號括住訊息。 此外,輸出運算式的大括弧語法 ({ }
) 可能也不同於在開發語言中輸出值的慣例。 (不過,大括弧 ({ }
) 內的內容仍應使用您的開發語言語法撰寫)。
如果您嘗試偵錯即時應用程式,並尋找類似的功能,請查看快照偵錯工具中的記錄點功能。 快照偵錯工具是用來調查生產應用程式中問題的工具。 記錄點也可讓您將訊息傳送至輸出視窗,而不需要修改原始程式碼,而且不會影響執行中的應用程式。 如需詳細資訊,請參閱偵錯即時 Azure 應用程式。