步驟 4:在偵錯工具中執行程式碼

上一個步驟:使用互動式 REPL 視窗

Visual Studio 提供功能來管理專案、豐富的編輯體驗、互動式視窗,以及 Python 程式碼的完整功能偵錯。 在偵錯工具中,您可以逐步執行程式碼 (包含迴圈的每個反覆項目)。 只要符合特定條件,您也可以暫停程式。 在偵錯工具中暫停程式的任何時間點,您都可以檢查整個程式狀態,以及變更變數的值。 這類動作是追蹤程式 Bug 的必要項目,也提供遵循確切程式流程的實用輔助。

  1. PythonApplication1.py 檔案中的程式碼取代為下列程式碼。 程式碼的這項差異會展開 make_dot_string,以在偵錯工具中檢查其離散步驟。 它也會將 for 迴圈放在 main 函式中,並呼叫該函式來明確執行它:

    from math import cos, radians
    
    # Create a string with spaces proportional to a cosine of x in degrees
    def make_dot_string(x):
        rad = radians(x)                             # cos works with radians
        numspaces = int(20 * cos(rad) + 20)          # scale to 0-40 spaces
        st = ' ' * numspaces + 'o'                   # place 'o' after the spaces
        return st
    
    def main():
        for i in range(0, 1800, 12):
            s = make_dot_string(i)
            print(s)
    
    main()
    
  2. 按下 F5,或選取 [偵錯]>[開始偵錯] 功能表命令,檢查程式碼運作是否正常。 此命令會在偵錯工具中執行程式碼。 到目前為止,在程式執行時,沒有做任何動作來暫停程式,它只會列印一些反覆項目的波浪圖樣。 按任意鍵以關閉輸出視窗。

    提示

    若要在程式完成時自動關閉輸出視窗,請選取 [工具]>[選項] 功能表命令,展開 [Python] 節點,選取 [偵錯],然後清除 [處理序正常結束時等候輸入] 選項:

    Python debugging option to close the output window on normal program exit

    如需偵錯以及如何設定指令碼和解譯器引數的詳細資訊,請參閱偵錯您的 Python 程式碼

  3. for 陳述式上設定中斷點,方法是按一下該行旁的灰色邊界,或者將插入點放在該行,並使用 [偵錯]>[切換中斷點] 命令 (F9)。 灰色邊界會出現紅點,以指出中斷點 (如下方箭號所註):

    Setting a breakpoint

  4. 重新啟動偵錯工具 (F5),您會看到執行中程式碼停在含該中斷點的行。 您可以在這裡檢查呼叫堆疊,並檢查變數。 範圍內的變數在定義時會出現在 [自動變數] 視窗中;您也可以切換至該視窗底部的 [區域變數] 檢視,以顯示 Visual Studio 在目前範圍中找到的所有變數 (包含函式),即使在定義之前也是一樣:

    Breakpoint UI experience for Python

  5. 觀察 Visual Studio 視窗頂端的偵錯工具列 (如下所示)。 此工具列可快速存取最常見的偵錯命令 (這也可以在 [偵錯] 功能表上找到):

    Essential debugging toolbar buttons

    從左到右的按鈕如下:

    Button Command
    繼續 (F5) 執行程式直到下一個中斷點或程式完成。
    全部中斷 (Ctrl+Alt+Break) 暫停長時間執行的程式。
    停止偵錯 (Shift+F5) 停止程式 (不管程式在哪裡),並結束偵錯工具。
    重新啟動 (Ctrl+Shift+F5) 停止程式 (不管程式在哪裡),並在偵錯工具中從頭重新啟動它。
    顯示下一個陳述式 (Alt+Num*) 切換至要執行的下一行程式碼。 如果您在偵錯工作階段期間巡覽程式碼,而且想要快速回到偵錯工具的暫停點,則這會有幫助。
    逐步執行 (F11) 執行下一個程式碼行,進入所呼叫的函式。
    逐程序 (F10) 執行下一個程式碼行,而不進入所呼叫的函式。
    跳出 (Shift+F11) 執行目前函式的其餘部分,並於呼叫端程式碼中暫停。
  6. 使用 [不進入函式],不進入 for 陳述式。 「逐步執行」表示偵錯工具執行目前程式碼行 (包含任何函式呼叫),然後再次立即暫停。 注意在程式碼中,變數 i 現在如何於 [區域變數] 和 [自動變數] 視窗中定義。

  7. 不進入可呼叫 make_dot_string 並暫停的下個程式碼行。 [不進入函式] 這裡特別表示偵錯工具會在傳回時執行整個 make_dot_string 並暫停。 除非該處有個別的中斷點,否則偵錯工具不會在該函式內部停止。

  8. 繼續逐步執行程式碼數次,並觀察 [區域變數] 或 [自動變數] 視窗中的值如何變更。

  9. 在 [區域變數] 或 [自動變數] 視窗中,按兩下 is 變數的 [值] 資料行,以編輯值。 按 Enter 或選取該值以外的任何區域,以套用任何變更。

  10. 使用 [逐步執行],繼續逐步執行程式碼。 [逐步執行] 表示偵錯工具進入具有偵錯資訊的任何函式呼叫 (例如 make_dot_string)。 位在 make_dot_string 內之後,您可以檢查其區域變數,並特別逐步執行其程式碼。

  11. 繼續逐步執行 [逐步執行],並注意到,當您到達 make_dot_string 結尾時,下個步驟會回到 s 變數中具有新傳回值的 for 迴圈。 當您再次逐步執行到 print 陳述式時,會注意到對 print 的 [逐步執行] 不會進入該函式。 原因是 print 不是以 Python 撰寫,而是 Python 執行階段內的原生程式碼。

  12. 繼續使用 [逐步執行],直到您再次到達 make_dot_string。 然後使用 [跳離函式],並注意到,您回到 for 迴圈。 使用 [跳離函式],偵錯工具會執行函式的其餘部分,然後在發出呼叫的程式碼中自動暫停。 當您逐步執行您想要偵錯的冗長函式的某些部分時,這會很有幫助。 它會逐步執行其餘部分,且不會在呼叫端程式碼中設定明確的中斷點。

  13. 若要繼續執行程式,直到達到下一個中斷點,請使用 [繼續] (F5)。 因為您在 for 迴圈中有中斷點,所以會在下一個反覆項目中斷。

  14. 逐步執行迴圈中的數百個反覆項目可能十分冗長,因此 Visual Studio 可讓您將「條件」新增至中斷點。 偵錯工具接著只會在符合條件時,將程式暫停於中斷點。 例如,您可以在 for 陳述式上使用含中斷點的條件,讓它只在 i 的值超過 1600 時暫停。 若要設定條件,請以滑鼠右鍵按一下中斷點紅點,然後選取 [條件] (Alt+F9>C)。 在出現的 [中斷點設定] 快顯視窗中,輸入 i > 1600 作為運算式,然後選取 [關閉]。 按 F5 繼續執行,並觀察程式在下一個中斷之前反覆執行多次。

    Setting a breakpoint condition

  15. 若要執行程式直到完成,請在邊界中的點上按一下滑鼠右鍵並選取 [停用中斷點] (Ctrl+F9) 來停用中斷點。 然後選取 [繼續] (或按 F5) 以 執行程式。 程式結束時,Visual Studio 會停止其偵錯工作階段,並回復為其編輯模式。 您也可以選取其點,或以滑鼠右鍵按一下該點,然後選取 [刪除中斷點] 來刪除中斷點。 它也會刪除您先前設定的任何條件。

提示

在某些情況下 (例如,無法啟動 Python 解譯器本身),輸出視窗只會短暫出現後自動關閉,而不讓您看到任何錯誤訊息。 如果發生這種情況,請以滑鼠右鍵按一下 [方案總管] 中的專案,並選取 [屬性],再選取 [偵錯] 索引標籤,然後將 -i 新增至 [解譯器引數] 欄位。 此引數會導致解譯器在程式完成之後進入互動模式,並在您輸入 Ctrl+Z>Enter 結束之前保持視窗開啟。

後續步驟

深入了解