VSCodeでおこなうpythonのデバッグ方法とlaunch.jsonについて解説

プログラミング

はじめに

 VSCodeでは異なるプログラミング言語であっても共通のUIでデバッグをおこなうことができます。デバッグの設定も .vscode/launch.json という設定ファイルで統一的に記述できます。

この記事ではVSCodeでpythonのデバッグをおこなう方法を述べます。

デバッグの流れ

 VSCodeでデバッグをおこなう際の流れをみていきましょう。

  1. サイドバーの「デバッグと実行」から .vscode/launch.json を作成します。
  2. ソースコードにブレークポイントを設定します。ソースコード内でF9キーを押すか、ソースコードの左側をクリックで設定可能です。
  3. デバッグを開始します。F5キーを押すか、デバッグビューの開始ボタンをクリックして開始できます。
  4. ブレークポイントでブログラムが停止し、デバッグビューで変数の値が確認できます。
  5. F10(ステップイン)やF11(ステップオーバー)を使ってプログラムを一行ずつ実行していきます。
  6. プログラムが終了すると、デバッグモードが解除されます。

以下ではこの流れを、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}☆ の拡張子

タイトルとURLをコピーしました