下記事では、Docker コンテナ内から直接デバッグ対象のプログラムをデバッグ実行する方法を記載しました。
www.moriken254.com
ところが、ユースケースというのは増えるものです。コンテナで実行しているプログラムを、リモートからデバッグしたいという場面もあったりします。
その方法も忘れないうちに。
前提
すでに対象の Docker コンテナは起動済みであるとします。また、「ローカル側から」アタッチしてコードをデバッグすることを想定します。
リモートマシンとローカルマシンでの環境構築は、下記を参考に行いました。
qiita.com
リモート側で大事なこと
コード内に直接下記を挿入します。好きなところに入れられるので、割と便利です。
import ptvsd
print("waiting...")
ptvsd.enable_attach()
ptvsd.wait_for_attach()
launch.json にリモートアタッチ用の設定を追加
リモートアタッチ用のコンフィグレーションを追加します。
例によって、VSCode 左側のメニューから、下図の項目を選択します。
Select Debug Configuration が表示されたら、Remote Attach を選択します。
Remote Debugging (1/2) にて、リモートの IP アドレスを入力します。同一 PC なら、まずlocalhost
で大丈夫です。
Remote Debugging (2/2) にて、ポート番号を入力します。空いていればなんでも良いので、デフォルトの 5678
で大丈夫です。
これで、デフォルトのコンフィグレーションが追加されます。
{
"name": "Python: Attach",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 5678,
}
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
],
"justMyCode": false,
},
launch.json を調整
実際に動作させる環境に合わせて、微調整が必要です。
"localRoot" がターゲットのコードのパスと異なると、break point をセットしてもキャッチされません。
よくあるのが、VSCode はリポジトリのルートディレクトリで開いているけど、デバッグしたいコードは結構下層のプロジェクトフォルダの中だったりする、というケース。
このような場合、ターゲットのコードがエントリポイントなら、"localRoot" を ${workspaceFolder} に書き換えることで、コードがあるフォルダを動的に指定することができます。
基本的な変数は下記に記載されていました。
qiita.com
用意されている変数でうまくいかないときは、任意の絶対パスに書き換えることで対応も可能です。
デバッグ実行
まずは、リモートで対象コードを実行します。
waiting...
と表示されたら、準備完了です。
ローカル側で対象コードの任意の行に break point をつけて、デバッグ実行してみましょう。catch に成功するはずです。
あとは、ライブラリ内のデバッグもしたいなら、"justMyCode" の設定を false
にすることも忘れずに。
www.moriken254.com