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

A conditional break

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

関数ブレークポイント

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

式の評価

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

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

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

マルチスレッド デバッグ

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、および 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. エラーを完全に削除するには、10-ptrace.conf という名前のファイルを /etc/sysctl.d/ に追加し、次の kernel.yama.ptrace_scope = 0 を追加します。

macOS

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

次のステップ

詳細については、以下を参照してください。

ご不明な点がある場合や、問題が発生した場合は、GitHub で問題を提出してください。