VS Codeのエージェントモードを拡張するには、を試してください!

Visual Studio Code で C++ をデバッグする

各ターゲット コンパイラ/プラットフォームの構成チュートリアルで指定されているようにデバッグ環境の基本を設定した後、このセクションでは C/C++ のデバッグに関する詳細を学習できます。

Visual Studio Code は、使用しているオペレーティング システムに応じて、C/C++ 用に次のデバッガーをサポートしています

  • Linux: GDB
  • macOS: LLDB または GDB
  • Windows: Visual Studio Windows デバッガーまたは GDB (Cygwin または MinGW を使用)

GDB による Windows デバッグ

VS Code を使用して、Cygwin または MinGW を使用して作成された Windows アプリケーションをデバッグできます。Cygwin または MinGW のデバッグ機能を使用するには、デバッガーのパスを起動構成 (launch.json) で手動で設定する必要があります。Cygwin または MinGW アプリケーションをデバッグするには、miDebuggerPath プロパティを追加し、その値を Cygwin または MinGW 環境に対応する gdb.exe の場所に設定します。

    "miDebuggerPath": "c:\\mingw\\bin\\gdb.exe"

Windows での Cygwin/MinGW のデバッグは、アタッチと起動の両方のデバッグ シナリオをサポートします。

詳細については、C/C++ のデバッグの構成 を参照してください。

Windows 上で GDB を使用してデバッグしている場合は、MinGW64 による Windows デバッグ を参照してください。

条件付きブレークポイント

条件付きブレークポイントを使用すると、条件の値が true の場合にのみ、特定のコード行で実行を中断できます。条件付きブレークポイントを設定するには、既存のブレークポイントを右クリックして [ブレークポイントの編集] を選択します。これにより小さな Peek ウィンドウが開き、デバッグ中にブレークポイントをヒットさせるために true と評価される必要がある条件を入力できます。

A conditional break

エディターでは、条件付きブレークポイントは、内部に黒い等号を持つブレークポイント記号で示されます。カーソルを条件付きブレークポイントの上に置くと、その条件が表示されます。

関数ブレークポイント

関数ブレークポイントを使用すると、特定のコード行ではなく、関数の先頭で実行を中断できます。関数ブレークポイントを設定するには、[実行] ビューで [ブレークポイント] セクション内を右クリックし、[関数ブレークポイントの追加] を選択して、実行を中断したい関数の名前を入力します。

式の評価

VS Code は、いくつかのコンテキストで式の評価をサポートしています

  • [実行] ビューの [ウォッチ] セクションに式を入力すると、ブレークポイントがヒットするたびに評価されます。
  • デバッグ コンソールに式を入力すると、一度だけ評価されます。
  • ブレークポイントで停止している間に、コードに現れる任意の式を評価できます。

[ウォッチ] セクションの式は、デバッグ中のアプリケーションで効果を発揮します。変数の値を変更する式は、プログラムの実行中、その変数を変更します。

マルチスレッドのデバッグ

VS Code 用の C/C++ 拡張機能には、マルチスレッド プログラムをデバッグする機能があります。すべてのスレッドとその呼び出し履歴は、[呼び出し履歴] セクションに表示されます。

Multi-threaded process

メモリ ダンプのデバッグ

VS Code 用の C/C++ 拡張機能には、メモリ ダンプをデバッグする機能もあります。メモリ ダンプをデバッグするには、launch.json ファイルを開き、C++ 起動 構成に coreDumpPath (GDB または LLDB の場合) または dumpPath (Visual Studio Windows デバッガーの場合) プロパティを追加し、その値をメモリ ダンプへのパスを含む文字列に設定します。これは、x64 マシンでデバッグされる x86 プログラムでも機能します。

追加のシンボル

デバッガーがシンボル ファイル (たとえば、Visual Studio Windows デバッガーの .pdb ファイル) を見つけられる追加のディレクトリがある場合、それらは additionalSOLibSearchPath (GDB または LLDB の場合) または symbolSearchPath (Visual Studio Windows デバッガーの場合) を追加することで指定できます。

    "additionalSOLibSearchPath": "/path/to/symbols;/another/path/to/symbols"

または

    "symbolSearchPath": "C:\\path\\to\\symbols;C:\\another\\path\\to\\symbols"

ソース ファイルの場所を指定する

ソース ファイルがコンパイル場所にない場合、ソース ファイルの場所を変更できます。これは、sourceFileMap セクションに追加された単純な置換ペアによって行われます。このリストの最初の一致が使用されます。

"sourceFileMap": {
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include/i686-linux-gnu": "/usr/include/i686-linux-gnu/c++/4.8",
    "/build/gcc-4.8-fNUjSI/gcc-4.8-4.8.4/build/i686-linux-gnu/libstdc++-v3/include": "/usr/include/c++/4.8"
}

GDB, LLDB, and LLDB-MI コマンド (GDB/LLDB)

C++ (GDB/LLDB) デバッグ環境では、-exec コマンドを使用してデバッグ コンソールから直接 GDB、LLDB、および LLDB-MI コマンドを実行できますが、注意してください。デバッグ コンソールで直接コマンドを実行することはテストされておらず、場合によっては VS Code がクラッシュする可能性があります。

その他のデバッグ機能

  • 無条件ブレークポイント
  • ウォッチ ウィンドウ
  • 呼び出し履歴
  • ステップ実行

VS Code でのデバッグの詳細については、VS Code でのデバッグ のこの概要を参照してください。

C/C++ アプリをデバッグできるように launch.json ファイルを構成するその他の方法については、C/C++ のデバッグの構成 を参照してください。

Natvis フレームワーク

Natvis フレームワークを使用して、デバッガーで C++ オブジェクトのカスタム ビューを作成できます。C/C++ 拡張機能で Natvis を使用する詳細については、ネイティブ オブジェクトのカスタム ビュー のトピックを参照してください。

リモートでデバッグする

Docker コンテナー内のプロセスのデバッグなど、リモート プロセスへのアタッチについては、パイプ トランスポート を参照してください。

デバッガーをデバッグする

Issue レポートの情報に基づいて診断できない拡張機能のデバッグ問題が発生している場合、ログを有効にしてログを送信するようお願いすることがあります。C/C++ 拡張機能のログを取得する方法については、デバッグ アダプターのログを有効にする を参照してください。

既知の制限事項

シンボルとコード ナビゲーション

すべてのプラットフォーム

  • 拡張機能は関数本体を解析しないため、関数本体内で定義されたシンボルに対して [定義をここに表示][定義へ移動] は機能しません。

デバッグ

Windows

  • Cygwin および MinGW 上の GDB は、実行中のプロセスを中断できません。アプリケーションが実行中 (デバッガーで停止していない) のときにブレークポイントを設定したり、デバッグ中のアプリケーションを一時停止するには、アプリケーションのターミナルで Ctrl-C を押します。
  • Cygwin 上の GDB はコア ダンプを開けません。

Linux

  • ptrace: Operation not permitted」というエラーが表示されることがあります。これは、GDB がプロセスにアタッチするために昇格された権限を必要とするためです。これは、以下の解決策を使用して解決できます。
    1. プロセスにアタッチ を使用する場合、デバッグ セッションが開始される前にパスワードを入力する必要があります。

    2. このエラーを一時的に無効にするには、次のコマンドを使用します

      echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

    3. エラーを恒久的に削除するには、/etc/sysctl.d/10-ptrace.conf というファイルを追加し、次の kernel.yama.ptrace_scope = 0 を追加します。

macOS

  • LLDB
    • LLDB でデバッグ中に、ブレーク モードでターミナル ウィンドウを閉じても、デバッグは停止しません。デバッグは [停止] ボタンを押すことで停止できます。
    • デバッグが停止しても、ターミナル ウィンドウは閉じられません。
  • GDB
    • macOS で GDB を使用するには、追加の手動インストール手順が必要です。READMEManual Installation of GDB for OS X を参照してください。
    • GDB でプロセスにアタッチする場合、デバッグ対象のアプリケーションは中断できません。GDB は、アプリケーションが実行されていないとき (アプリケーションにアタッチする前、またはアプリケーションが停止状態にあるとき) に設定されたブレークポイントのみをバインドします。これは GDB のバグ が原因です。
    • GDB でデバッグする場合、コア ダンプはロードできません。これは、GDB が macOS で使用されるコア ダンプ形式をサポートしていないためです。
    • GDB でプロセスにアタッチしている場合、すべて中断するとプロセスが終了します。

次のステップ

さらに読む

他に質問がある場合や問題が発生した場合は、GitHub で Issue を報告してください。