---
# System prepended metadata

title: VS Code 的 Run and Debug 怎麼設定

---

# 第一步: 如何用 ctrl + shift + B 執行一個 shell script 編譯我的專案

### 定義一個 task
https://stackoverflow.com/questions/70804147/how-to-run-bash-script-within-vs-code
在你的 tasks.json 設定 command 執行一個 bash
就可以做任何你需要做的事情
不管你的編譯過程有多複雜都可以
如果有什麼參數必須從 VS Code 帶給那支 bash script，就用 args 帶過去, 例如 ${fileDirname}
### 執行 task
你可以用 ctrl + shift + B 執行預設的 task
注意 group.kind 必須定義成 "build" 才會出現在 ctrl + shift + B 的清單

或者你也可以用 ctrl + shift + P 叫出命令選單
輸入 run task 執行 Task: Run Task
這樣 VS Code 就會列出他在 tasks.json 中找到的 task

更複雜一點, 如果你有某個 task B 必須依賴另一個 task A 先執行
那你可以設定 task B 的dependsOn 欄位 ( 參考 https://code.visualstudio.com/docs/editor/tasks )

如果不想使用 dependsOn 欄位，你可以把每個 task A 和 task B 都寫成單獨的 shell script
在 tasks.json 中定義兩個 task 分別執行 A 和 B
並且在 task_b_script 中呼叫 task_a_script

那你就不用學習太多跟 tasks.json 相關的知識

# 第二步: ctrl + shift +B 太麻煩了 如何用 F5 解決

因為 ctrl + shift + B 我覺得有點麻煩

而且我希望 Run and Debug 有我所有需要執行的東西
而不是有些在 Run and Debug 有些在 Tasks 選單

所以弄了一個不正式的做法 

# VS Code 的 Run and Debug 怎麼設定

VS Code 按下 F5 時會根據你在 Run and Debug 面板選取的 Config 執行不同的任務
設定好 launch.json 就可以透過 F5 執行各式各樣的 Task 例如編譯和偵錯

## launch.json 的用途

在一個新的工作目錄中 按下 F5
此時因為沒有設定 launch.json 的內容
VS Code 不知道你想做什麼, 此時會跳出一些選項問你是否要 Debug 或是 Run
根據你的選擇, 自動產生一個 config 在 launch.json 中

## config 的內容

launch.json 中的 configurations 欄位可以定義多個 config
config 中幾個比較重要的欄位如下

- name
  就是你在左側 Run and Debug 下拉選單會看到的名稱

- type
  定義要使用哪一個 extension
  例如 
  "type": "cppbuild" 是用來編譯 cpp 的
  "type": "python" 是用來執行 python
  "type": "cppdbg" 可以利用 gdb 偵錯 cpp

## 如何 F5 編譯 cpp

如果希望按下 F5 的時候執行編譯
你可以使用 "type":"cppbuild" 並且將適當的參數傳給這個 extension
但是如果你不想學習怎麼設定這些參數, 或是遇到問題
有一個簡單的 workaround

1. 使用 "type":"cppdbg" 
2. 將 preLaunchTask 設定為你在 tasks.json 中定義的編譯任務名稱 (label欄位)
3. 將 "program": 指向一個找不到路徑的可執行檔
   

這樣當你按下 F5 執行這個 config, 他就會先進行 preLaunchTask 的編譯過程
接著因為找不到執行檔而結束, 並產生錯誤訊息
或是你也可以將 "program" 指向一個執行後就會立刻結束的可執行檔
並且印出 "build completed" 之類的訊息

關於 preLaunchTask 欄位可以參考
https://code.visualstudio.com/docs/cpp/config-linux


## 如何 debug cpp

如同前一節設定使用 "type":"cppdbg"
只是將 program 設定成編譯後產生的可執行檔路徑

