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

A conditional break

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

関数ブレークポイント

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

式の評価

VS Code は複数のコンテキストで式評価をサポートしています

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

ウォッチセクションの式は、デバッグ中のアプリケーションに影響を与えます。変数の値を変更する式は、プログラムの実行中その変数を変更します。

マルチスレッド デバッグ

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

Multi-threaded process

メモリダンプ デバッグ

VS Code 用 C/C++ 拡張機能には、メモリダンプをデバッグする機能もあります。メモリダンプをデバッグするには、launch.json ファイルを開き、coreDumpPath (GDB または LLDB の場合) または dumpPath (Visual Studio Windows デバッガーの場合) プロパティをC++ 起動構成に追加し、その値をメモリダンプへのパスを含む文字列として設定します。これは、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、および 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 フレームワーク

デバッガーで C++ オブジェクトのカスタムビューを Natvis フレームワークを使用して作成します。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 は macOS で使用されるコアダンプ形式をサポートしていないため、GDB でデバッグしているときにコアダンプを読み込むことはできません。
    • GDB でプロセスにアタッチしている場合、break-all はプロセスを終了します。

次のステップ

詳細については、以下をお読みください。

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

© . This site is unofficial and not affiliated with Microsoft.