C/C++ のデバッグを構成する
launch.json
ファイルは、Visual Studio Code でデバッガーを構成するために使用されます。
Visual Studio Code は、必要な情報のほぼすべてを含む launch.json
(プロジェクトの .vscode
フォルダー内) を生成します。デバッグを開始するには、デバッグする予定の実行可能ファイルへのパスを program
フィールドに入力する必要があります。これは、launch (起動) と attach (アタッチ) の両方の構成で指定する必要があります (実行中のインスタンスにいつでもアタッチする予定がある場合)。
生成されたファイルには 2 つのセクションが含まれます。1 つは launch (起動) 用のデバッグを構成するセクションで、もう 1 つは attach (アタッチ) 用のデバッグを構成するセクションです。
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 の統合ターミナルを使用します。
- Linux: true に設定すると、外部コンソールを生成するよう VS Code に通知します。false に設定すると、VS Code の統合ターミナルを使用します。
- macOS: true に設定すると、
lldb-mi
を介して外部コンソールを生成します。false に設定すると、出力は VS Code のデバッグ コンソールに表示されます。lldb-mi
の制限により、統合ターミナルのサポートは利用できません。
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 の場合、すべてのライブラリのシンボルが読み込まれます。それ以外の場合、solib シンボルは読み込まれません。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 コンテナー内のプロセスのデバッグなど、リモート プロセスへのアタッチに関する情報については、パイプ トランスポート設定の記事を参照してください。
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' です。