VSCodeデバッグが止まらない!ブレークポイントで停止しない原因と解決方法

プログラミング・IT

「VSCodeでブレークポイントを設定したのに、デバッグが全然止まらない…」
「ブレークポイントがグレーアウトしてる…」
「デバッグ実行したら、そのまま最後まで走り切ってしまう…」

デバッグは、プログラムの問題を見つけるための重要な機能です。でも、ブレークポイントで止まってくれないと意味がないですよね。

この記事では、VSCodeでデバッグがブレークポイントで止まらない原因と、その解決方法を初心者の方にもわかりやすく解説します。

言語別の対処法も含めて、網羅的に説明していきますね。

スポンサーリンク
  1. デバッグがブレークポイントで止まらない主な原因
    1. 1. ファイルが保存されていない
    2. 2. ファイルパスが一致していない
    3. 3. ソースコードとビルド済みコードが一致していない
    4. 4. デバッグ設定ファイル(launch.json)が不適切
    5. 5. ファイル名やパスに日本語が含まれている
    6. 6. コードが最適化されている
  2. 共通の解決方法
    1. 解決方法1:ファイルを保存してビルドし直す
    2. 解決方法2:VSCodeを再起動する
    3. 解決方法3:ブレークポイントを再設定する
    4. 解決方法4:「すべてのブレークポイントを再適用」を実行
    5. 解決方法5:ファイル名とディレクトリ名を英数字に変更
    6. 解決方法6:デバッグ対象のコードに到達しているか確認
  3. Python特有の解決方法
    1. 問題1:「justMyCode」設定が原因
    2. 問題2:pytest-covが干渉している
    3. 問題3:Python仮想環境が正しく認識されていない
  4. JavaScript/TypeScript特有の解決方法
    1. 問題1:webRootの設定が間違っている
    2. 問題2:URLが一致していない
    3. 問題3:Chromeのデバッグポートが開いていない
    4. 問題4:ソースマップが生成されていない
  5. Java特有の解決方法
    1. 問題1:JDKのパスが正しく設定されていない
    2. 問題2:デバッグ設定のクラスパスが間違っている
  6. C/C++特有の解決方法
    1. 問題:デバッグ情報が含まれていない
  7. launch.jsonの基本的な作り方
    1. launch.jsonの作成手順
  8. よくある質問
    1. Q1. ブレークポイントが灰色(グレーアウト)になっている
    2. Q2. デバッグは開始するが、すぐに終了してしまう
    3. Q3. 条件付きブレークポイントを設定したい
    4. Q4. 外部ライブラリの中でもデバッグしたい
  9. まとめ:デバッグが止まらないときの確認リスト

デバッグがブレークポイントで止まらない主な原因

まず、なぜブレークポイントで止まらないのか、主な原因を見ていきましょう。

1. ファイルが保存されていない

最も基本的な原因です。

ファイルを編集してから保存していないと、古いコードがデバッグされてしまいます。

確認方法:
タブにファイル名の横に「●」や「✕」マークが付いていたら未保存です。

解決方法:
Ctrl + S(MacはCmd + S)でファイルを保存してから、もう一度デバッグを実行してください。

2. ファイルパスが一致していない

VSCodeは、設定ファイルに記載されたパスと、実際に実行されるコードのパスが一致しないと、ブレークポイントを認識できません。

特に、JavaScriptやTypeScriptなどで、ビルドやトランスパイルを行う場合によく起こります。

3. ソースコードとビルド済みコードが一致していない

コンパイルやビルドが必要な言語(C++、Java、TypeScriptなど)で、ソースコードを変更したのにビルドし直していない場合、古いコードがデバッグされます。

4. デバッグ設定ファイル(launch.json)が不適切

launch.jsonの設定が間違っていたり、必要な設定が抜けていると、デバッグが正しく動作しません。

5. ファイル名やパスに日本語が含まれている

意外と見落としがちですが、ファイル名やディレクトリ名に日本語(全角文字)が含まれていると、デバッガが正しくファイルを認識できないことがあります。

6. コードが最適化されている

最適化されたコードでは、関数がインライン化されたり、コードの順番が変わったりして、ブレークポイントが無視されることがあります。

共通の解決方法

言語に関係なく試せる基本的な解決方法を紹介します。

解決方法1:ファイルを保存してビルドし直す

手順:

  1. Ctrl + S(MacはCmd + S)でファイルを保存
  2. コンパイルやビルドが必要な言語の場合は、再ビルドする
  3. もう一度デバッグを開始

これだけで解決することも多いです。

解決方法2:VSCodeを再起動する

一時的な不具合の場合、VSCodeを再起動すると直ることがあります。

手順:

  1. VSCodeをすべて閉じる
  2. もう一度VSCodeを開く
  3. デバッグを試してみる

単純ですが、効果的な方法です。

解決方法3:ブレークポイントを再設定する

ブレークポイントが正しく認識されていない可能性があります。

手順:

  1. 既存のブレークポイントをすべて削除(行番号の赤い丸をクリック)
  2. もう一度、止めたい行にブレークポイントを設定
  3. デバッグを実行

解決方法4:「すべてのブレークポイントを再適用」を実行

デバッグ中にブレークポイントの認識がずれることがあります。

手順:

  1. デバッグを開始
  2. 左側のデバッグパネルにある「ブレークポイント」セクションを右クリック
  3. 「すべてのブレークポイントを再適用」を選択

これで、ブレークポイントが再認識されます。

解決方法5:ファイル名とディレクトリ名を英数字に変更

日本語のファイル名やディレクトリ名を使っている場合は、すべて英数字に変更しましょう。

ダメな例:

C:\Users\太郎\プログラム\テスト.py

良い例:

C:\Users\taro\program\test.py

ファイル名を変更したら、launch.jsonの設定も忘れずに更新してください。

解決方法6:デバッグ対象のコードに到達しているか確認

ブレークポイントを設定した行が、そもそも実行されていない可能性があります。

確認方法:

ブレークポイントを設定した行の前後に、以下のようなコードを追加してみましょう。

Pythonの場合:

print("ここを通過しました")

JavaScriptの場合:

console.log("ここを通過しました");

もし、このメッセージが出力されない場合は、そのコードに到達していないということです。条件分岐やループの条件を見直してください。

Python特有の解決方法

Pythonでデバッグがうまくいかない場合の対処法です。

問題1:「justMyCode」設定が原因

Pythonのデバッグでは、「justMyCode」という設定がデフォルトで有効になっています。この設定がオンだと、ライブラリ内部のコードではブレークポイントが無視されることがあります。

解決方法:

launch.jsonに以下を追加します。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "justMyCode": false
    }
  ]
}

justMyCode: false」を追加することで、ライブラリ内部のコードでも止まるようになります。

問題2:pytest-covが干渉している

pytest-covというテストカバレッジのモジュールを使っている場合、デバッガと干渉してブレークポイントが無視されます。

解決方法:

launch.jsonに以下の設定を追加します。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "env": {
        "PYTEST_ADDOPTS": "--no-cov"
      }
    }
  ]
}

または、settings.jsonに以下を追加します。

{
  "python.testing.pytestArgs": ["-vv", "-s", "--no-cov"]
}

これで、pytest実行時にカバレッジ測定が無効になり、デバッガが正常に動作します。

問題3:Python仮想環境が正しく認識されていない

仮想環境(venvやconda環境)を使っている場合、VSCodeが正しいインタープリタを認識していないことがあります。

解決方法:

手順1:インタープリタを選択

  1. Ctrl + Shift + P(MacはCmd + Shift + P)でコマンドパレットを開く
  2. Python: Select Interpreter」と入力して選択
  3. 使用している仮想環境のPythonインタープリタを選択

手順2:launch.jsonに明示的にパスを指定

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: Current File",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "pythonPath": "${workspaceFolder}/venv/bin/python"
    }
  ]
}

仮想環境のPythonパスに合わせて、「pythonPath」を設定してください。

JavaScript/TypeScript特有の解決方法

JavaScriptやTypeScriptのデバッグで止まらない場合の対処法です。

問題1:webRootの設定が間違っている

Reactなど、フロントエンドのデバッグで、webRootの設定が間違っているとブレークポイントが認識されません。

解決方法:

launch.jsonの「webRoot」を確認します。

一般的な設定:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}/src"
    }
  ]
}

プロジェクトのソースコードがどこにあるかによって、「${workspaceFolder}」や「${workspaceFolder}/src」など、適切なパスを設定してください。

問題2:URLが一致していない

ブラウザでアクセスするURLと、launch.jsonに設定したURLが一致していないと、ブレークポイントが無視されます。

例:

launch.jsonに「http://localhost:3000」と書いてあるのに、ブラウザで「http://localhost:3000/index.html」にアクセスしていると、止まりません。

解決方法:

URLにワイルドカードを使います。

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:3000/*",
      "webRoot": "${workspaceFolder}"
    }
  ]
}

「*/」をURLの末尾に追加することで、どのページでもブレークポイントが有効になります。

問題3:Chromeのデバッグポートが開いていない

VSCodeとChromeを連携してデバッグする場合、Chromeがデバッグポートで起動されている必要があります。

解決方法:

launch.jsonに「runtimeArgs」を追加して、Chromeをデバッグモードで起動します。

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "chrome",
      "request": "launch",
      "name": "Launch Chrome",
      "url": "http://localhost:3000",
      "webRoot": "${workspaceFolder}",
      "runtimeArgs": [
        "--remote-debugging-port=9222"
      ]
    }
  ]
}

これで、VSCodeからChromeへの接続が確立されます。

問題4:ソースマップが生成されていない

TypeScriptやバンドルツール(Webpack、Viteなど)を使っている場合、ソースマップが生成されていないとブレークポイントが認識されません。

解決方法:

ビルド設定でソースマップを有効にします。

TypeScriptの場合(tsconfig.json):

{
  "compilerOptions": {
    "sourceMap": true
  }
}

Webpackの場合(webpack.config.js):

module.exports = {
  devtool: 'source-map'
};

設定を変更したら、プロジェクトを再ビルドしてください。

Java特有の解決方法

Javaでブレークポイントが止まらない場合の対処法です。

問題1:JDKのパスが正しく設定されていない

JDKが正しくインストールされていないか、環境変数が設定されていないと、デバッグが動作しません。

解決方法:

手順1:JDKがインストールされているか確認

ターミナルで以下のコマンドを実行します。

java -version
javac -version

バージョン情報が表示されればOKです。表示されない場合は、JDKをインストールしてください。

手順2:環境変数を設定

WindowsならJAVA_HOMEを設定し、Pathに追加します。

手順3:VSCodeの設定を確認

settings.jsonに以下を追加します。

{
  "java.home": "C:\\Program Files\\Java\\jdk-17"
}

JDKのインストールパスに合わせて変更してください。

問題2:デバッグ設定のクラスパスが間違っている

launch.jsonのクラスパスやメインクラスの指定が間違っていると、正しくデバッグできません。

解決方法:

launch.jsonを見直します。

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "java",
      "name": "Debug (Launch) - Current File",
      "request": "launch",
      "mainClass": "${file}"
    }
  ]
}

パッケージ構造に合わせて、「mainClass」を適切に設定してください。

C/C++特有の解決方法

C/C++でブレークポイントが止まらない場合の対処法です。

問題:デバッグ情報が含まれていない

コンパイル時にデバッグ情報(-gオプション)を付けていないと、デバッガが機能しません。

解決方法:

tasks.jsonのコンパイルオプションに「-g」を追加します。

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "C++ Build",
      "type": "shell",
      "command": "g++",
      "args": [
        "-g",
        "-O0",
        "${file}",
        "-o",
        "${fileDirname}/${fileBasenameNoExtension}"
      ],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

-g: デバッグ情報を含める
-O0: 最適化を無効にする(これがないとブレークポイントで止まらないことがある)

この設定でビルドし直してから、デバッグを実行してください。

launch.jsonの基本的な作り方

launch.jsonがない、または壊れている場合の作り方を説明します。

launch.jsonの作成手順

手順1:デバッグビューを開く

画面左側の虫アイコン(デバッグアイコン)をクリックします。

手順2:「launch.jsonファイルを作成します」をクリック

デバッグビューの上部に表示されるリンクをクリックします。

手順3:デバッグ環境を選択

使用している言語を選択します(Python、Node.js、Chromeなど)。

手順4:自動生成されたファイルを確認

.vscodeフォルダ内にlaunch.jsonが作成されます。必要に応じて編集してください。

よくある質問

Q1. ブレークポイントが灰色(グレーアウト)になっている

原因:
ブレークポイントが「バインドされていない」状態です。つまり、デバッガがそのコードを認識できていません。

対策:

  • ファイルを保存する
  • ソースコードとビルド済みコードを一致させる
  • launch.jsonのパス設定を見直す
  • ファイル名やパスに日本語が含まれていないか確認

Q2. デバッグは開始するが、すぐに終了してしまう

原因:
プログラムが一瞬で実行完了してしまっています。

対策:
プログラムの最後に入力待ちを入れます。

Pythonの例:

input("Press Enter to exit...")

C++の例:

std::cin.get();

これで、プログラムが終了せずに待機してくれます。

Q3. 条件付きブレークポイントを設定したい

特定の条件のときだけ止めたい場合は、条件付きブレークポイントを使います。

設定方法:

  1. ブレークポイントを設定したい行番号を右クリック
  2. 「条件付きブレークポイント」を選択
  3. 条件を入力(例:「i == 5」や「name == “太郎”」)

これで、条件を満たしたときだけ停止します。

Q4. 外部ライブラリの中でもデバッグしたい

Pythonの場合:
launch.jsonに「justMyCode: false」を追加します。

JavaScriptの場合:
launch.jsonに以下を追加します。

{
  "skipFiles": []
}

デフォルトでは、node_modules内のコードはスキップされますが、この設定で解除できます。

まとめ:デバッグが止まらないときの確認リスト

最後に、デバッグが止まらないときの確認リストをまとめます。

基本的な確認項目:

□ ファイルを保存したか
□ ビルドやコンパイルが必要な言語で、再ビルドしたか
□ ブレークポイントが実行されるコード行に設定されているか
□ ファイル名やディレクトリ名に日本語が含まれていないか
□ VSCodeを再起動してみたか

設定の確認項目:

□ launch.jsonが存在するか
□ launch.jsonのパス設定が正しいか
□ デバッグに必要な拡張機能がインストールされているか
□ 言語ごとの環境(JDK、Python、Node.jsなど)が正しくインストールされているか

言語別の確認項目:

Python:
□ 「justMyCode」がfalseになっているか
□ pytest-covを使っている場合、「–no-cov」を追加したか
□ 正しいPythonインタープリタが選択されているか

JavaScript/TypeScript:
□ ソースマップが生成されているか
□ webRootの設定が正しいか
□ URLとlaunch.jsonの設定が一致しているか

Java:
□ JDKが正しくインストールされているか
□ 環境変数が設定されているか

C/C++:
□ コンパイル時に「-g」オプションを付けているか
□ 最適化(-O2など)を無効にしているか

デバッグがうまくいかないときは、この記事を参考に、一つずつ確認してみてください。

デバッグ機能を使いこなせば、プログラムの問題を見つける時間が大幅に短縮されます。最初は設定が面倒に感じるかもしれませんが、一度設定してしまえば、その後の開発が驚くほど快適になりますよ!

コメント

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