設定 C/C++ 偵錯

launch.json 檔案用於設定 Visual Studio Code 中的 偵錯工具

Visual Studio Code 會產生一個 launch.json(位於您專案內的 .vscode 資料夾下),其中包含幾乎所有必要的資訊。若要開始偵錯,您需要將 program 欄位填入您計畫偵錯的可執行檔路徑。無論是「啟動」(launch) 還是「附加」(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

僅在啟動偵錯對象 (debuggee) 時使用。對於 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
}

設定目標應用程式

下列選項可讓您在啟動目標應用程式時修改其狀態

引數

要在程式啟動時傳遞給程式的命令列引數 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 將連線到的偵錯工具。必須設為 gdblldb。這是針對每個作業系統預先設定的,可視需要進行變更。

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": "執行目標", "ignoreFailures": false }]

customLaunchSetupCommands

如果提供此項目,它會取代用於啟動目標的預設命令,改用其他命令。例如,這可以是 "-target-attach" 以附加至目標處理序。空白的命令列表會使啟動命令替換為無,如果偵錯工具是透過命令列選項提供啟動選項,這會很有用。範例:"customLaunchSetupCommands": [ { "text": "target-run", "description": "執行目標", "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"

偵錯傾印 (dump) 檔案

C/C++ 擴充功能可在 Windows 上偵錯傾印檔案,並在 Linux 和 OS X 上偵錯核心傾印 (core dump) 檔案。

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,則永遠使用硬體中斷點。預設值為 falselimit 是可用的硬體中斷點數量的選擇性限制,僅在 require 為 true 且 limit 大於 0 時強制執行。預設值為 0。範例:"hardwareBreakpoints": { require: true, limit: 6 }

其他屬性

processId

預設為 ${command:pickProcess},這將顯示偵錯工具可附加的可用處理序清單。我們建議您保留此預設值,但該屬性可明確設定為特定的處理序 ID 以供偵錯工具附加。

request

指示設定區段是要 launch(啟動)程式,還是 attach(附加)到已經在執行的執行個體。

targetArchitecture

已過時 此選項不再需要,因為目標架構會自動偵測。

類型

指示所使用的基礎偵錯工具。使用 Visual Studio Windows 偵錯工具時必須為 cppvsdbg,使用 GDB 或 LLDB 時則為 cppdbg。建立 launch.json 檔案時,此值會自動設為正確的值。

sourceFileMap

這允許將編譯時間的來源路徑對應至本機來源位置。這是一個鍵/值對物件,會解析第一個符合字串的路徑。(範例:"sourceFileMap": { "/mnt/c": "c:\\" } 會對應偵錯工具傳回且以 /mnt/c 開頭的任何路徑,並將其轉換為 c:\\。您可以在物件中擁有多次對應,但會依照提供的順序進行處理。)

環境變數定義檔

環境變數定義檔是一個簡單的文字檔,包含 環境變數=值 格式的鍵值對,並以 # 作為註解。不支援多行值。

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'。

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