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 デバッグ

Cygwin または MinGW を使用して作成された Windows アプリケーションは、VS Code を使用してデバッグできます。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 の場合にのみ、特定のコード行で実行を中断できます。条件付きブレークポイントを設定するには、既存のブレークポイントを右クリックし、ブレークポイントの編集 を選択します。これにより、小さなプレビューウィンドウが開き、デバッグ中にブレークポイントに到達するために 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 Debugger 用) プロパティを追加し、その値をメモリダンプへのパスを含む文字列として設定します。これは、x64 マシンでデバッグされる x86 プログラムでも機能します。

追加のシンボル

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

    "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、および 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 コンテナー内のプロセスをデバッグするなど、リモートプロセスへのアタッチに関する情報については、「パイプトランスポート」を参照してください。

デバッガーのデバッグ

イシューレポートの情報に基づいて診断できない拡張機能のデバッグ問題が発生している場合は、ログを有効にしてログを送信していただくようお願いすることがあります。デバッグアダプターのログを有効にする を参照して、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 を使用するには、追加の手動インストール手順が必要です。README の「OS X 用 GDB の手動インストール」を参照してください。
    • GDB でプロセスにアタッチする場合、デバッグ中のアプリケーションを中断することはできません。GDB は、アプリケーションが実行されていないとき (アプリケーションにアタッチする前、またはアプリケーションが停止状態にあるとき) に設定されたブレークポイントのみをバインドします。これは、GDB のバグによるものです。
    • GDB でデバッグする場合、GDB が macOS で使用されるコアダンプ形式をサポートしていないため、コアダンプをロードできません。
    • GDB でプロセスにアタッチされている場合、すべて中断するとプロセスが終了します。

次のステップ

さらに読む

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