本篇 ShengYu 介紹在 macOS 使用 Visual Studio Code(VS Code) 設定 C/C++ 除錯的環境,
以下 macOS 使用 VS Code 設定除錯環境的內容大概分為
- VS Code 除錯環境設定
- VS Code 安裝 CodeLLDB extension
- VS Code 偵錯前先編譯
- VS Code 開啟 make 專案
- VS Code 開啟 cmake 專案
- VS Code 錯誤排除
那我們開始吧!
VS Code 除錯環境設定
我的 VS Code 版本為 1.67.2,macOS 版本為 10.13.4,
在新專案下按下 F5 時如果沒有 .vscode/launch.json
設定檔的話,會跳出一些選項讓你選擇,如圖中的 C++ (GDB/LLDB)
新專案下沒有 .vscode/tasks.json
設定檔的話,也會跳出選項讓你選擇,由於 macOS 早就已經棄用 gcc,所以這邊是選擇使用 clang,
會在資料夾下產生 .vscode/launch.json 設定如下,如果沒有的話自己手動新增也可以,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
}
]
}
編譯 C/C++ 時記得加上 -g
選項,按 F5 執行 Start Debugging 後,
出現 Unable to start debugging. LLDB exited unexpectedly with exit code 137 (0x89).
如下圖所示,
看到這篇文章分享將 .vscode/launch.json
的 type 從原本的 cppdbg
改成 lldb
就可以使用了,type 改成 lldb
後像這樣,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(lldb) Launch",
"type": "lldb",
"request": "launch",
"program": "${workspaceFolder}/a.out",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
}
]
}
將 .vscode/launch.json
的 type 改成 lldb
後,再按 F5 執行 Start Debugging 後,
出現 Configured debug type 'lldb' is not supported.
如下圖所示,
看到這篇 troyibm 這位網友他也遇到同樣的問題,結果是安裝了 CodeLLDB 擴充套件就可以使用了!那我們來安裝 CodeLLDB 擴充套件吧。
VS Code 安裝 CodeLLDB extension
接下來就安裝CodeLLDB擴充套件,
網頁有寫支援的平台,
- Linux with glibc 2.18+ for x86_64, aarch64 or armhf,
- MacOS X 10.10+ for x86_64 and 11.0+ for arm64,
- Windows 10 for x86_64.
看起來三大平台都有支援。
接著再次 F5 執行 Start Debugging 終於成功了!
經過這次安裝 CodeLLDB extension 後,之後在新專案要 按 F5 時會有 LLDB 新的選項,可以直接選擇 LLDB,
選擇 LLDB 後產生的 launch.json 如下,然後記得修改 program 裡的名稱,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/<your program>",
"args": [],
"cwd": "${workspaceFolder}"
}
]
}
VS Code 偵錯前先編譯
VS Code 按下 F5 要先編譯再啟動偵錯的話,要在 launch.json 加上 preLaunchTask,如下範例,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug",
"program": "${workspaceFolder}/a.out",
"args": [],
"cwd": "${workspaceFolder}",
"preLaunchTask": "C/C++: clang++ build"
}
]
}
launch.json 的 "preLaunchTask": "C/C++: clang++ build"
是對應到 tasks.json 的 label 名稱,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: clang++ build",
"command": "/usr/bin/clang++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/a.out"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "偵錯工具產生的工作。"
}
],
"version": "2.0.0"
}
這樣按 F5 啟動偵錯前會先編譯,成功編譯才會啟動偵錯。
詳細的 .vscode
設定可以參考 https://github.com/shengyu7697/vscode-debugging/tree/master/mac-lldb
其他參考
launch.json 參數說明
Visual Studio Code (VSCode) 之 C/C++ 调试配置详解
[VSCode] Visual Studio Code 執行 C++ (2) - IntelliSense + Building + Debugging
make 專案
make 專案編譯時會使用 Makefile 來執行裡面的腳本,所以 .vscode/tasks.json
不能在使用 cppbuild
type 要換成 shell
來執行 make 這個指令,
然後 command 換成 cd ${workspaceFolder}; /usr/bin/make
,如下所示,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22{
"tasks": [
{
"type": "shell",
"label": "C/C++: make build",
"command": "cd ${workspaceFolder}; /usr/bin/make",
"args": [],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "偵錯工具產生的工作。"
}
],
"version": "2.0.0"
}
這邊也可以參考 Stack Overflow 跟 github gist 兩篇的其他種做法。
cmake 專案
cmake 專案在 generate 時,要使用 cmake -DCMAKE_BUILD_TYPE=Debug ..
給定編譯 Debug 版本,之後編譯出來的執行檔才有除錯的資訊,或者在 CMakeLists.txt 直接寫死是 Debug 版本,1
set(CMAKE_BUILD_TYPE "Debug")
.vscode/tasks.json
這邊可以參考這篇的寫法,將 cmake generate 與 cmake build 分成兩個 task,再用 C/C++: cmake build 這個 task 將前兩者串起來,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34{
"tasks": [
{
"label": "C/C++: cmake build",
"dependsOrder": "sequence",
"dependsOn":["cmake generate", "cmake build"]
},
{
"type": "shell",
"label": "cmake generate",
"command": "cd ${workspaceFolder}/build; /usr/bin/env cmake ..",
"args": []
},
{
"type": "shell",
"label": "cmake build",
"command": "cd ${workspaceFolder}/build; /usr/bin/env cmake --build .",
"args": [],
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "偵錯工具產生的工作。"
}
],
"options": {
"cwd": "${workspaceRoot}/build"
},
"version": "2.0.0"
}
VS Code 錯誤排除
如果在除錯的過程中逐步執行發現跳不到原始碼遇到 Could not load source ... 'SourceRequest' not supported
這樣的錯誤訊息的話,可能就是找不到原始碼的路徑,可能就是因為執行檔跟原始碼擺放路徑不同,解決方式就是在 launch.json 使用 sourceFileMap
將正確的路徑對應好,再次啟動就可以正確找到了~~
以上就是 macOS 使用 VS Code Debugger 除錯介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
其他參考
Debug a C++ project in VS Code - Youtube
其它相關文章推薦
Ubuntu 使用 VS Code Debugger 除錯教學
Visual Studio Code 常用快捷鍵
VS Code 新增 C++ 標頭檔路徑