除錯
無論工具列上的開關設定為 Interpreted(解釋)還是 Compiled(編譯),Routine 或 Events 圖的一次執行都可以在任意語句之前停下,供你檢視,並逐條語句地向前推進。這適用於逐步執行的圖;Flows 或 Function 圖本身沒有可供在其間停下的步驟,因此 Flows 執行只會在它所呼叫的 Routine 內部暫停。斷點也可以設在文件所使用的 C# 檔案的某一行上——請參閱下文的 C# 檔案中的斷點。
設定斷點
選擇一條語句——即帶有執行引腳的節點,例如 Print Line——然後按 F9。其標題左側會出現一個紅點,狀態列顯示 Set breakpoint on Print Line。再按一次 F9 即可清除。節點 Properties 中的 Breakpoint 開關作用相同。斷點隨文件一起儲存,並且與任何編輯一樣,設定斷點也是復原歷史中的一個步驟。
執行到斷點
按 F5。當執行可以被暫停時,畫布周圍會出現一個紅色邊框。執行會在帶有斷點的節點之前停下——該節點尚未執行——並且:
- 該節點會顯示粗的琥珀色邊框並標為 paused,同時被移到檢視中央並選中;
- 工具列上的 Run 變為 Stop,Properties 面板切換到 Debug 檢視;
- 狀態列會給出該節點及其所在的圖——Paused at Print Line in Graph - F5 continues, F10 steps over, F11 steps into, Shift+F11 steps out, Shift+F5 stops——並在旁邊顯示本次執行所處的模式。
如果該語句位於另一個文件中——即本文件所引用的某個文件的 Routine 或 Function——那個文件的標籤頁會被切換到前臺;當你繼續時,執行會在你眼前繼續進行:無論顯示的是哪個標籤頁,它輸出的行都會留在主控台上。

編譯執行
當開關設為 Compiled 時,有地方可停的執行會以除錯方式構建:程式在執行每條語句之前都會通知編輯器,並保留每個節點產生的結果,因此它可以像解釋執行一樣停下、單步執行並顯示值——同樣的紅色邊框、琥珀色邊框、Debug 檢視和狀態列,並在狀態旁顯示 Compiled。當文件本身、在標籤頁中開啟的被引用文件,或其引用的 C# 檔案的某一行上設有斷點時,這次執行就有地方可停。另一種進入方式是在沒有任何執行時按 F11:它會以除錯方式構建執行,並在第一條語句之前停下。
沒有地方可停的執行會一如既往地為速度而構建:沒有什麼能暫停它,它與文件匯出所得的程式完全相同。以除錯方式構建的程式執行緊湊迴圈時要慢上數倍,這就是為什麼只有在執行可以停下時才會以除錯方式構建。
儲存在未開啟的被引用文件中的斷點會讓解釋執行停下,但不會讓編譯執行停下:請先開啟那個文件。
C# 檔案中的斷點
當文件使用某個 C# 檔案時,開啟該檔案——使用 Ctrl+O 並選擇 Code files 型別,或將其拖到視窗上——它的文字標籤頁在行號左側有一條窄欄。按一下某一行旁邊的窄欄,或將游標放在該行上並按 F9:會出現一個紅點,狀態列顯示 Set breakpoint on line 6。當你在斷點上方輸入內容時,斷點會跟隨其所在的行移動;斷點會一直保留到編輯器關閉,但不會被儲存。
以任意一種方式執行文件。當對該檔案的呼叫到達這一行時,檔案的標籤頁會切換到前臺,該行以琥珀色高亮顯示,窄欄中出現一個箭頭,狀態列顯示 Paused at line 6 of MathScript.cs - F5 continues, …。呼叫堆疊中會有一行表示該檔案的方法——MathScript.Twice · line 6 MathScript.cs——位於呼叫它的圖之上;Locals 列出該方法的實參和目前已賦值的變數,例如 [double] value 3 和 [double] doubled 6。F10、F11 和 Shift+F11 可以逐行單步執行該檔案,並跳出返回到圖中。

執行使用的是檔案已儲存的版本,因此如果你的編輯使行號發生了變動,請在除錯之前儲存。lambda、迭代器和非同步方法內部的行,以及由頂級語句組成的檔案,會執行但不會停下;對 DLL 的呼叫會整體執行。
檢視目前位置
Debug 檢視從上到下依次為:
- Continue、Pause、Stop、Step over、Step into 和 Step out。
- Paused,顯示節點和圖,並提醒你該節點尚未執行。
- Call stack(呼叫堆疊)——執行目前所處的每個圖各佔一行,最內層的排在最前,例如 Graph · Print Line, inside For。按一下某一行可檢視該圖,其中所處的語句會被標出。
- Locals(局部值)——本輪中已執行的每個節點,每個引腳一行:[In] 表示輸入的值,[Out] 表示輸出的值——例如 For 節點的 [In] End 2 和 [Out] Current Value 0。值尚未計算出來的引腳顯示為 no value yet。按一下某一行可檢視其完整的值——影像顯示為影像,表格顯示為表格。
- Data members(資料成員)——圖所能存取到的每個資料成員的目前值,例如 [Number] Total 2。
主控台停靠欄的 Locals 和 Call stack 標籤頁列出相同的內容,而執行到目前為止列印的內容已顯示在其 Console 標籤頁上。
繼續推進
| 按鍵 | 作用 |
|---|---|
F5 |
繼續執行到下一個斷點,或執行到結束 |
F10 |
單步跳過(Step over):執行這條語句,並在同一個圖中的下一條語句之前停下——對另一個 Routine 或 Function 的呼叫會整體執行 |
F11 |
單步進入(Step into):在任意位置的下一條語句之前停下,會進入該語句所呼叫的 Routine 或它所到達的 C# 方法。在沒有任何執行時,啟動一次執行並在其第一條語句之前停下 |
Shift+F11 |
單步跳出(Step out):完成目前圖,並在返回到呼叫它的圖後停下 |
Shift+F5 |
停止執行 |
Debug 檢視上的 Pause 會讓正在進行的執行在其下一條語句之前停下——這是在沒有斷點的情況下進入長迴圈的方法。暫停時按 F9 可以為本次執行的剩餘部分設定或清除斷點。
當語句失敗時
當執行可除錯時——解釋執行總是可除錯,編譯執行在以除錯方式構建時可除錯——失敗的語句(例如檔案不存在、擷取文字超出其末尾)會讓執行在該處暫停,無論那裡是否有斷點。Debug 檢視和狀態列會說明失敗的內容:Paused at Print Line in Graph, which failed: … - F5 ends the run。檢視導致失敗的值,然後按 F5 結束執行——主控台會開啟並定位到失敗資訊(即其最後一行)——或按 Shift+F5 停止執行。為速度而構建的編譯執行如果失敗,不會暫停:它會結束,主控台會開啟並定位到失敗資訊。