自分用メモ

プログラミングとかのメモを書きたいです

VSCode+Pythonのリモートデバッグ

追記:もっと良い方法があった。こっちだとソース修正が不要になる。→ VSCode+Pythonのリモートデバッグ:その2 - 自分用メモ


HTTF2022のようなマラソンマッチでは、作成したpythonスクリプトを別プログラムからキックすることになることが多い。 普段のようにVSCodeから実行する場合は、ブレークポイントを仕掛けたりエラー箇所で停止して変数を見れたりするけれど、別プログラムからキックされている場合はそんなことはできないので困る。

このようなときにどうすればよいのか?を調べて見つけたのでメモする。

なお、この手順はWindows10のWSL2のUbuntu上のpython3で行っている。 VSCodeについては、Windows上で動いているけどRemote機能をつかってUbuntu接続している。

やること

事前準備:ptvsd をインストール(pip install ptvsd)

  1. pythonスクリプトにptvsdのコードを追記する。
  2. pythonスクリプトを実行する
    • 指定されたポートを開いて、デバッガがつなぎに来るまで待つ
  3. VScode からアタッチする

Pythonコードに追加

コード例

pythonスクリプトの先頭の方に追記するもの

import sys
# デバッグ用(引数にdebugがあればptvsdでデバッグする)
if (len(sys.argv) > 1) and (sys.argv[1] == "debug"):
    import ptvsd
    print("## [debug mode] waiting for debugger attach (port:5678)", file=sys.stderr)
    ptvsd.enable_attach(address=('0.0.0.0', 5678))
    ptvsd.wait_for_attach()
    print("## [debug mode] debugger was attached", file=sys.stderr)

VScodeのアタッチの設定例

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: アタッチ",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "localhost",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "${workspaceFolder}",
                }
            ]
        }
    ]
}