[VSCode] 使用 debugpy 模組,遠端除錯 Python 程式

[VSCode] 使用 debugpy 模組,遠端除錯 Python 程式

今天終於把 VSCode 的 Python 遠端除錯功能弄好了!

以前我都是用 python pdb,

但是用這種文字互動模式的缺點是,

不像 IDE 那樣可以很方便的查看多個變數,

下中斷點也不像在 IDE 上直接下那樣方便~

 

今天研究了一下,VSCode 可以搭配 debugpy 這個模組,

就能實現對遠端機器上的 Python 程式除錯囉~

(以前是用 ptvsd,但現在似乎被 debugpy 取代了)

 

1. 在遠端機器執行 debugpy

首先在遠端機器上用 pip 安裝 debugpy 模組:

pip install debugpy

 

接著執行如下的指令,讓 debugpy 監聽 30000 port,

等待 VSCode 連線進來後,才開始執行 test.py:

python -m debugpy --listen 0.0.0.0:30000 --wait-for-client ./test.py

 

執行完上面的指令,就會停在那邊,等待 VSCode 的連線進來。

 

2. 從 VSCode 端連線至遠端機器

在 VSCode > Debug > Add Configuration,

新增一個除錯設定檔如下,這邊的 host 要設成遠端機器的 IP 或機器名稱,

port 要設定成 debugpy 那邊設定的 port (本例中是 30000):

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: Remote Attach",
            "type": "python",
            "request": "attach",
            "port": 30000,
            "host": "172.22.1.1",
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}/src",
                    "remoteRoot": "."
                }
            ]
        }
    ]
}

 

接著在 VSCode > Run Debug > Start Debugging on VSCode,

就會使用這邊的設定,連線到遠端機器的 debugpy,

可以開始除錯了,不管是設中斷點、單步執行、整個函式執行,

或是改變現在要執行的敘述、顯示變數的值等等,都沒有問題~

 

因為一旦連上線後,遠端的程式就會開始跑,

因此最好先在 VSCode 端先設好中斷點,免得無法停在想觀察的地方。

設中斷點有幾種方法:

  • VSCode > Debug > Toggle Breakpoint 或是 New Breakpoint
  • 在 VSCode 程式編輯畫面,行數的左邊點一下 (會有小紅點出現)
  • 在程式碼裡插入 debugpy.breakpoint() 函式呼叫

 

使用 debugpy.breakpoint() 的用法如下:

import debugpy
debugpy.breakpoint()

 

以方便性來說,當然是第一種和第二種比較方便,

可以動態新增或刪除中斷點。

但比較奇怪的是,有時候程式就直接衝過去,

好像沒有管 VSCode 上的中斷點… (可能是某種 bug)

這時候比較穩當的方法,就還是在程式裡,

插入一個 debugpy.breakpoint() 的函式呼叫,只要跑到就一定會停下來囉~

 

參考資料:

Python debug configurations in Visual Studio Code

使用VS Code對遠端server的python程式進行debug

(本頁面已被瀏覽過 2,378 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料