はじめに
VSCodeでは異なるプログラミング言語であっても共通のUIでデバッグをおこなうことができます。デバッグの設定も .vscode/launch.json
という設定ファイルで統一的に記述できます。
この記事ではVSCodeでpythonのデバッグをおこなう方法を述べます。
デバッグの流れ
VSCodeでデバッグをおこなう際の流れをみていきましょう。
- サイドバーの「デバッグと実行」から
.vscode/launch.json
を作成します。 - ソースコードにブレークポイントを設定します。ソースコード内でF9キーを押すか、ソースコードの左側をクリックで設定可能です。
- デバッグを開始します。F5キーを押すか、デバッグビューの開始ボタンをクリックして開始できます。
- ブレークポイントでブログラムが停止し、デバッグビューで変数の値が確認できます。
- F10(ステップイン)やF11(ステップオーバー)を使ってプログラムを一行ずつ実行していきます。
- プログラムが終了すると、デバッグモードが解除されます。
以下ではこの流れを、Fizz_Buzz問題のプログラムを例にとって詳しくみていきます。
def fizz_buzz(number):
if number % 15 == 0:
print("Fizz Buzz!")
elif number % 3 == 0:
print("Fizz!")
elif number % 5 == 0:
print("Buzz!")
else:
print(number)
if __name__ == '__main__':
for i in range(50):
fizz_buzz(i)
デバッグ実行の詳細
上記で述べたデバッグ実行の関して、各種機能の詳細を述べます。
ブレークポイントの設定
プログラムの進行を特定の箇所で一時停止させるソースコードの位置を、ブレークポイントといいます。
ブレークポイントの設定は、ソースコード内でF9キーを押すか、ソースコードの左側をクリックで可能です。
また、ブレークポイントには種類があり、ソースコードの左側を右クリックすることで選択できます。
それぞれのブレークポイントの内容は次の通りです。
- 「ブレークポイントの追加」: 対応の箇所でプログラムを一時停止します。
- 「条件付きブレークポイントの追加」: if文を追加するように評価式を設定できます。この評価式が
true
になる場合のみ、この行で停止します。 - 「ログポイントを追加」: 対応に行に到達した際、記載した内容がデバッグコンソールに表示されます。変数の値を出力するには
{ }
で囲みます。
ステップ実行
デバッグが開始されると、エディターの上部にステップ実行のボタンが表示されます。それぞれのアイコンの機能は以下の通りです。
アイコン | ショートカット | 機能名 | 機能 |
---|---|---|---|
F5 | 続行 | 次のブレークポイントで停止するまで処理を続ける | |
F10 | ステップオーバー | 現在の行の処理を実行し、次の行で停止する | |
F11 | ステップイン | 現在の行の実行が関数の場合、その関数の中でステップ実行に進む | |
Shift + F11 | ステップアウト | 現在実行中の関数が終わるまで進み、呼び出し元関数で停止する | |
Cmd⌘ + Shift + F5 | 再起動 | デバッグ実行しているプログラムを再起動する | |
Shift + F5 | 停止 | デバッグ実行しているプログラムを停止する |
データインスペクション
ブレークポイントでプログラムが停止しているときに、変数の値を確認したり更新したりすることを、データインスペクションといいます。
デバッグビューにはブレークポイントに到達しプログラムが停止すると、その時点の変数や呼び出している関数の一覧が表示されます。
そして、デバッグビューに表示されている変数の値をクリックして、直接書き換えることが可能です。
また、画面下部の「デバッグコンソール」タブ内で評価式を入力することで、変数の値を確認したり、関数を実行したりできます。
デバッグの設定 launch.jsonの編集
デバッグの設定は、.vscode/launch.json ファイルに記載できます。このファイルは冒頭で述べた通り、サイドバーの「デバッグと実行」から自動的に作成されます。
以下は launch.json
の例です。これは、起動にコマンドライン引数の指定が必要なファイルの記載と、FastAPIのデバッグ実行の記載をしています。
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Main File",
"type": "python",
"request": "launch",
"program": "main.py",
"args": ["arg1", "arg2"], // コマンドライン引数を指定
"console": "integratedTerminal"
},
{
"name": "Python: FastAPI",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": ["api.server:app", "--host", "0.0.0.0", "--reload"], // apiディレクトリ直下のserver.pyを実行
"cwd": "${workspaceFolder}",
"jinja": true
}
]
}
launch.json
で使用される項目の一部は次の通りです。
項目名 | 内容 |
---|---|
“program” | 実行するプログラムのパスを記載 |
“args” | プログラム実行の引数 |
“cwd” | プログラムを実行するときの作業フォルダー |
“env” | 環境変数 |
“console” | デバッグが実行されるコンソール ・”internalConsole”: デバッグコンソールタブで実行される ・”integratedTerminal”: ターミナルタブで実行される |
また、launch.json
で使用される変数の一部は次の通りです。
変数名 | 内容 |
---|---|
${workspaceFolder} | ワークスペースのフルパス |
${workspaceFolderBasename} | ワークスペースのディレクトリ名 |
${file} | エディターで開いているファイル (以降☆と記載) のフルパス |
${relativeFile} | ワークスペースからの ☆ のパス |
${fileBasename} | ☆ のファイル名 |
${fileBasenameNoExtension} | ☆ のファイル名から拡張子を除いたもの |
${fileDirname} | ☆ のディレクトリ名 |
${fileExtname} | ☆ の拡張子 |