VSCode の Python デバッガ の機能をまとめる
意外とprintデバッグをしている人もいるような気がするのでまとめておきます。
生成AI時代だからこそコードベースがリッチになり、求められるデバッグ技術も高度になっている気がしています。
debugpy - a debugger for Python
VSCodeではPython標準とは異なるデバッガが実装されています。
VSCodeのPythonデバッガ(debugpy)は、言語公式のpdbからGUI 操作や可視化機能、リモート/マルチスレッド対応などを拡張しているとのこと。また、よく使われるデバッガ通信プロトコルであるDebug Adapter Protocol(DAP)に対応しています。言語公式よりも高機能かつ標準的?かなと思っています。
VSCodeでの導入設定はここに記載の通りです。
何ができるのか?
実行サンプル
以下をデバッグ対象とします。
2つの行列a, bをランダムに定義し、その2つの誤差項付きの行列和と計算するfuncA, funcBを定義しています。
import numpy as np
def funcA(x, y):
return x + y + np.random.rand()
def funcB(x, y):
return x * y + np.random.rand()
a = np.random.rand(10, 10)
b = np.random.rand(10, 10)
c = funcA(a, b)
d = funcB(a, b)
print("all done")
ブレークポイント & 変数確認
適当にブレークポイントを貼って変数の値を確認します。
左上のVariablesペインに変数の値が表示されます。
面白い点として、numpyでは変数の初期化時にmaxとminが自動で計算されていて、その値も確認できるという点です。
このペインには、special variablesやfunction variablesなどのpython特有の区分けや事前定義メソッドが出てきます。これらについては例えば以下の書籍などに詳しく説明があります。
変数を右クリックし、watchに追加することでしたのwatchペインでも確認することができるようになります。変数のブックマーク的なものです。
変則ブレーク
ブレークポイント設置時に右クリックすることで、変則的なブレークポイントが設置可能です。
例えば、以下の設定を行うと行列aの平均値が0.5を超えるときのみブレークします。このコードの場合には、半分ぐらいの確率でブレークします。
それ以外にもいくつかの変則的な設定が可能です。
コールスタック
funcA内でブレークポイントを設定し、call stackペインを見ると、2つの項目が確認できます。
ここをfuncAから<module>に切り替えることで、funcA呼び出し直前の変数の状態などを確認することができます。Variablesペインの表示内容が切り替わっているのが確認できます。
Pythonを使う場合にはCを使うような場合と違って、変数の渡し方や関数フレームサイズを確認するということは少ないかと思います。したがって、シングルスレッドでコールスタックを使う機会はあまりない印象です。
マルチスレッドのときには、あるスレッドのブレークポイントで停止したときの他スレッド状態を確認する場合に、このペインで他スレッドのコンテキストへの切り替えを行えます。
デバッグコンソール
下部のDebug consolleペインを使って、ブレークポイントを停止した時点のランタイムにアタッチすることができます。
以下ではprintする部分でブレークを貼り、その時点のランタイム状況に沿ってDebug consolleペインから評価式を入力することで、cとdにどれぐらいの差が出ているのかを確認しています。
以上、debugpyを用いて標準的にできることを説明しました。
Cデバッガだともっと様々な情報が見えて面白いですので、また追々。
Discussion