C/C++ デバッグの設定
launch.json ファイルは、Visual Studio Code でデバッガーを設定するために使用されます。
Visual Studio Code は、必要な情報のほぼすべてを含む launch.json を(プロジェクト内の .vscode フォルダー下に)生成します。デバッグを開始するには、program フィールドにデバッグ対象の実行ファイルへのパスを入力する必要があります。これは、launch(起動)および attach(既存プロセスへのアタッチ)の両方の構成で指定しなければなりません(いずれかの時点で実行中のインスタンスにアタッチする場合)。
生成されたファイルには、起動時(launch)のデバッグ設定と、アタッチ時(attach)のデバッグ設定の 2 つのセクションが含まれています。
VS Code のデバッグ動作の設定
デバッグ中の VS Code の動作を制御するには、次のオプションを設定または変更します。
program (必須)
デバッガーが起動またはアタッチする実行ファイルのフルパスを指定します。デバッガーはデバッグシンボルを読み込むためにこの場所を必要とします。
symbolSearchPath
Visual Studio Windows デバッガーに対して、シンボル (.pdb) ファイルを検索するパスを指示します。複数のパスはセミコロンで区切ります。例: "C:\\Symbols;C:\\SymbolDir2"
requireExactSource
Visual Studio Windows デバッガーに対し、現在のソースコードが pdb と一致していることを要求するオプションのフラグです。
additionalSOLibSearchPath
GDB または LLDB に対して、.so ファイルを検索するパスを指示します。複数のパスはセミコロンで区切ります。例: "/Users/user/dir1;/Users/user/dir2"
externalConsole
デバッグ対象を起動する場合にのみ使用されます。attach の場合、このパラメーターはデバッグ対象の動作を変更しません。
- Windows: true に設定すると、外部コンソールが起動します。false に設定すると、VS Code の integratedTerminal(統合ターミナル)が使用されます。
- Linux: true に設定すると、外部コンソールを起動するように VS Code に通知します。false に設定すると、VS Code の integratedTerminal が使用されます。
- macOS: true に設定すると、
lldb-miを介して外部コンソールが起動します。false に設定すると、VS Code の debugConsole(デバッグコンソール)に出力されます。lldb-miの制限により、integratedTerminal のサポートは利用できません。
avoidWindowsConsoleRedirection
Windows 上の gdb で VS Code の統合ターミナルをサポートするために、拡張機能はデバッグ対象の引数にコンソールリダイレクトコマンドを追加し、コンソールの入出力を統合ターミナルに表示させます。このオプションを true に設定すると、この機能が無効になります。
logging
デバッグコンソールに記録するメッセージの種類を決定するオプションフラグです。
- exceptions: 例外メッセージをデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは true です。
- moduleLoad: モジュールの読み込みイベントをデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは true です。
- programOutput: プログラムの出力をデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは true です。
- engineLogging: 診断エンジンログをデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは false です。
- trace: 診断アダプターのコマンドトレースをデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは false です。
- traceResponse: 診断アダプターのコマンドおよび応答のトレースをデバッグコンソールに記録するかどうかを決定するオプションフラグ。デフォルトは false です。
visualizerFile
デバッグ時に使用する .natvis ファイル。Natvis ファイルの作成方法については、ネイティブオブジェクトのカスタムビューの作成を参照してください。
showDisplayString
visualizerFile が指定されている場合、showDisplayString は表示文字列を有効にします。このオプションをオンにすると、デバッグ中にパフォーマンスが低下する可能性があります。
例
{
"name": "C++ Launch (Windows)",
"type": "cppvsdbg",
"request": "launch",
"program": "C:\\app1\\Debug\\app1.exe",
"symbolSearchPath": "C:\\Symbols;C:\\SymbolDir2",
"externalConsole": true,
"logging": {
"moduleLoad": false,
"trace": true
},
"visualizerFile": "${workspaceFolder}/my.natvis",
"showDisplayString": true
}
ターゲットアプリケーションの設定
以下のオプションを使用すると、ターゲットアプリケーションの起動時の状態を変更できます。
args
プログラムの起動時に渡すコマンドライン引数の JSON 配列。例: ["arg1", "arg2"]。文字をエスケープする場合は、二重にエスケープする必要があります。例えば、["{\\\"arg1\\\": true}"] は、アプリケーションに {"arg1": true} を送信します。
cwd
デバッガーによって起動されるアプリケーションの作業ディレクトリを設定します。
environment
プログラムの環境に追加する環境変数。例: [ { "name": "config", "value": "Debug" } ] ([ { "config": "Debug" } ] ではありません)。
例
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/a.out",
"args": ["arg1", "arg2"],
"environment": [{ "name": "config", "value": "Debug" }],
"cwd": "${workspaceFolder}"
}
GDB または LLDB のカスタマイズ
以下のオプションを設定することで、GDB または LLDB の動作を変更できます。
MIMode
VS Code が接続するデバッガーを指定します。gdb または lldb に設定する必要があります。これはオペレーティングシステムごとに事前構成されており、必要に応じて変更可能です。
miDebuggerPath
デバッガー(gdb など)へのパス。実行ファイルのみが指定されている場合、オペレーティングシステムの PATH 変数でデバッガーを検索します(Linux と Windows では GDB、OS X では LLDB)。
miDebuggerArgs
デバッガー(gdb など)に渡す追加の引数。
stopAtEntry
true に設定すると、デバッガーはターゲットのエントリポイントで停止します(アタッチ時は無視されます)。デフォルト値は false です。
stopAtConnect
true に設定すると、デバッガーはターゲットへの接続後に停止します。false に設定すると、接続後にデバッガーは実行を継続します。デフォルト値は false です。
setupCommands
GDB または LLDB をセットアップするために実行するコマンドの JSON 配列。例: "setupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]
customLaunchSetupCommands
指定された場合、ターゲットを起動するためのデフォルトのコマンドを別のコマンドで置き換えます。例えば、ターゲットプロセスにアタッチするために "-target-attach" を使用できます。空のコマンドリストを指定すると、起動コマンドが何も実行されなくなります。これは、デバッガーに起動オプションがコマンドラインオプションとして提供されている場合に役立ちます。例: "customLaunchSetupCommands": [ { "text": "target-run", "description": "run target", "ignoreFailures": false }]
launchCompleteCommand
ターゲットプロセスを実行させるために、デバッガーのセットアップ完了後に実行するコマンド。許可される値は "exec-run", "exec-continue", "None" です。デフォルト値は "exec-run" です。
例
{
"name": "C++ Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/a.out",
"stopAtEntry": false,
"customLaunchSetupCommands": [
{ "text": "target-run", "description": "run target", "ignoreFailures": false }
],
"launchCompleteCommand": "exec-run",
"linux": {
"MIMode": "gdb",
"miDebuggerPath": "/usr/bin/gdb"
},
"osx": {
"MIMode": "lldb"
},
"windows": {
"MIMode": "gdb",
"miDebuggerPath": "C:\\MinGw\\bin\\gdb.exe"
}
}
symbolLoadInfo
- loadAll: true の場合、すべてのライブラリのシンボルが読み込まれます。それ以外の場合、共有ライブラリのシンボルは読み込まれません。ExceptionList によって変更されます。デフォルト値は true です。
- exceptionList: セミコロン
;で区切られたファイル名のリスト(ワイルドカード可)。LoadAll の動作を変更します。LoadAll が true の場合、リスト内の名前と一致するライブラリのシンボルは読み込まれません。それ以外の場合、一致するライブラリのシンボルのみが読み込まれます。例:"foo.so;bar.so"
ダンプファイルのデバッグ
C/C++ 拡張機能は、Windows 上のダンプファイル、および Linux と OS X 上のコアダンプファイルのデバッグをサポートしています。
dumpPath
Windows のダンプファイルをデバッグする場合は、launch 構成でこの値をダンプファイルへのパスに設定し、デバッグを開始します。
coreDumpPath
デバッグ対象プログラムのコアダンプファイルのフルパス。launch 構成でこの値をコアダンプファイルへのパスに設定し、デバッグを開始します。注: コアダンプのデバッグは MinGw ではサポートされていません。
リモートデバッグまたはローカルデバッガーサーバーを使用したデバッグ
miDebuggerServerAddress
リモートデバッグ時に接続するデバッガーサーバー(gdbserver など)のネットワークアドレス(例: localhost:1234)。
debugServerPath
起動するデバッグサーバーへのフルパス。
debugServerArgs
デバッグサーバーの引数。
serverStarted
デバッグサーバーの出力で検索するサーバー起動パターンの文字列。正規表現がサポートされています。
filterStdout
true に設定すると、stdout ストリームを検索してサーバー起動パターンを探し、stdout をデバッグ出力に記録します。デフォルト値は true です。
filterStderr
true に設定すると、stderr ストリームを検索してサーバー起動パターンを探し、stderr をデバッグ出力に記録します。デフォルト値は false です。
serverLaunchTimeout
デバッガーが debugServer の起動を待機する時間(ミリ秒単位)。デフォルトは 10000 です。
pipeTransport
Docker コンテナ内のプロセスをデバッグするなど、リモートプロセスへのアタッチに関する情報については、Pipe transport 設定の記事を参照してください。
hardwareBreakpoints
指定された場合、リモートターゲットのハードウェアブレークポイントの動作を明示的に制御します。require が true に設定されている場合、常にハードウェアブレークポイントを使用します。デフォルト値は false です。limit は使用可能なハードウェアブレークポイント数の上限を指定するオプションであり、require が true かつ limit が 0 より大きい場合のみ適用されます。デフォルト値は 0 です。例: "hardwareBreakpoints": { require: true, limit: 6 }
追加のプロパティ
processId
デフォルトは ${command:pickProcess} で、デバッガーがアタッチ可能なプロセスの一覧を表示します。このデフォルトのままにすることをお勧めしますが、プロパティを特定のプロセス ID に明示的に設定して、デバッガーをアタッチすることも可能です。
request
構成セクションがプログラムを launch(起動)するためのものか、実行中のインスタンスに attach(アタッチ)するためのものかを示します。
targetArchitecture
非推奨 このオプションはターゲットアーキテクチャが自動的に検出されるため、不要になりました。
type
使用されている基盤となるデバッガーを示します。Visual Studio Windows デバッガーを使用する場合は cppvsdbg、GDB または LLDB を使用する場合は cppdbg にする必要があります。これは launch.json ファイルが作成されるときに自動的に正しい値に設定されます。
sourceFileMap
これにより、コンパイル時のソースパスをローカルのソース場所に対応付けることができます。キーと値のペアを持つオブジェクトであり、最初に文字列が一致したパスを解決します。(例: "sourceFileMap": { "/mnt/c": "c:\\" } は、デバッガーによって返された /mnt/c で始まるパスを c:\\ に変換します。オブジェクト内に複数のマッピングを持つことができますが、提供された順序で処理されます。)
環境変数定義ファイル
環境変数定義ファイルは、environment_variable=value という形式のキーと値のペアを含むシンプルなテキストファイルで、# はコメントに使用されます。複数行の値はサポートされていません。
cppvsdbg デバッガー構成には、デバッグ目的で変数を簡単に設定できる envFile プロパティも含まれています。
例えば
project.env ファイル:
# project.env
# Example environment with key as 'MYENVRIONMENTPATH' and value as C:\\Users\\USERNAME\\Project
MYENVRIONMENTPATH=C:\\Users\\USERNAME\\Project
# Variables with spaces
SPACED_OUT_PATH="C:\\This Has Spaces\\Project"
シンボルオプション
symbolOptions 要素を使用すると、デバッガーがシンボルを検索する方法をカスタマイズできます。例:
"symbolOptions": {
"searchPaths": [
"C:\\src\\MyOtherProject\\bin\\debug",
"https://my-companies-symbols-server"
],
"searchMicrosoftSymbolServer": true,
"cachePath": "%TEMP%\\symcache",
"moduleFilter": {
"mode": "loadAllButExcluded",
"excludedModules": [ "DoNotLookForThisOne*.dll" ]
}
}
プロパティ
searchPaths: .pdb ファイルを検索するためのシンボルサーバー URL(例: https://msdl.microsoft.com/download/symbols)またはディレクトリ(例: /build/symbols)の配列。これらのディレクトリは、デフォルトの場所(モジュールの隣、および pdb が元々配置されていた場所)に加えて検索されます。
searchMicrosoftSymbolServer: true の場合、Microsoft シンボルサーバー (https://msdl.microsoft.com/download/symbols) がシンボル検索パスに追加されます。未指定の場合、このオプションのデフォルトは false です。
cachePath: シンボルサーバーからダウンロードしたシンボルをキャッシュするディレクトリ。未指定の場合、デバッガーはデフォルトで %TEMP%\SymbolCache を使用します。
moduleFilter.mode: この値は "loadAllButExcluded" または "loadOnlyIncluded" です。"loadAllButExcluded" モードでは、モジュールが 'excludedModules' 配列に含まれている場合を除き、すべてのモジュールのシンボルを読み込みます。"loadOnlyIncluded" モードでは、'includedModules' 配列に含まれているか、'includeSymbolsNextToModules' 設定を通じて含まれている場合を除き、どのモジュールのシンボルも読み込みません。
"loadAllButExcluded" モードのプロパティ
moduleFilter.excludedModules: デバッガーがシンボルを読み込んではならないモジュールの配列。ワイルドカード(例: MyCompany.*.dll)がサポートされています。
"loadOnlyIncluded" モードのプロパティ
moduleFilter.includedModules: デバッガーがシンボルを読み込むべきモジュールの配列。ワイルドカード(例: MyCompany.*.dll)がサポートされています。
moduleFilter.includeSymbolsNextToModules: true の場合、'includedModules' 配列にないモジュールについても、デバッガーはモジュール自体および起動実行ファイルの隣を検索しますが、シンボル検索リストのパスは検索しません。このオプションのデフォルトは 'true' です。