はじめに
 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} | ☆ の拡張子 | 

 
  
  
  
  

