寫代碼難免有bug,關鍵在於快速定位。
掌握調試方法可以加快問題的定位。本文以C和Python爲例介紹vscode中如何調試代碼。
一 配置調試文件
1 針對c/c++的調試配置
在vscode中,如果需要進行調試,是通過編寫一個launch.json
文件進行配置。點開調試的側邊欄,就可以看到提示:
按提示點擊創建 launch.json 文件
,首先會提示選擇調試環境,Linux類系統選擇C++(GDB/LLDB)
,Windows系統選擇C++(Windows)
,本文以Linux類系統爲例。
選擇C++(GDB/LLDB)
後,還會提示選擇配置,如果不選擇,就會生成一個空配置的launch.json
。
這裏可以選擇gcc - 生成和調試活動文件
,然後就會在項目根目錄的.vscode
內創建launch.json
和task.json
文件,我們先看下launch.json
,如下:
{
"version": "0.2.0",
"configurations": [
{
"name": "gcc - 生成和調試活動文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "lldb",
"preLaunchTask": "C/C++: gcc 生成活動文件"
}
]
}
理解其中字段的含義,後續就可以依葫蘆畫瓢編寫自己的配置,關鍵字段的含義如下:
-
name
:配置的名字,可以存在不同配置,一般是一個調試目標有一個配置(顯示在調試側邊欄上下拉選擇列表中); -
type
:表明調試器的類型,使用Visual Studio Windows Debuger的時候必須是cppvsdbg
;使用GDB或者LLDB時爲cppdbg
; -
request
:表明是執行(launch
)目標程序,還是連接(attach
)已有的實例; -
program
:表明調試的目標程序; -
args
:執行目標參數需要的參數,格式爲json列表; -
cwd
:目標程序執行的工作目錄; -
MIMode
:表明使用的調試器,gdb
或者是lldb
; -
preLaunchTask
:就是在開始調試前需要執行的任務,定義在task.json
文件中,一般用來定義編譯任務,生成目標程序。
接下來看下同時創建的task.json
文件,內容如下:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: gcc 生成活動文件",
"command": "/usr/bin/gcc",
"args": [
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "調試器生成的任務。"
}
],
"version": "2.0.0"
}
其實就是執行指定args
參數的command
,可以看到其作用就是編譯當前的活動文件。
其中label
字段定義的就是一個task的名字,在launch.json
中通過preLaunchTask
字段指明task的名字就可以了。
其他幾個字段的含義:
-
type
:表明task的類型; -
options
:就是一些其他可選的設置; -
group
:是該task的組別,可以通過命令面板執行同一個組別的多個task。
以筆者的習慣爲例,編譯一般用編譯腳本進行,比如只需要在項目根目錄執行build.sh
,目標程序就會編譯生成(具體編譯細節不在此介紹了),那麼可以新增一個task,如下:
{
"type": "shell",
"label": "Build All Targets",
"command": "bash",
"args": [
"./build.sh"
],
"options": {
"cwd": "${workspaceFolder}"
},
"detail": "執行編譯任務"
}
注意
type
指定成了shell
,如果你的腳本是可以直接執行的,那麼command
也可以直接寫成./build.sh
;此時,command
也可以是任何在shell中能夠使用的命令。
因此,配置文件的思路是很清晰的:launch.json
指明要調試的目標,需要的參數和工作目錄;通過preLaunchTask
指明開始執行調試目標前需要進行的工作。
2 針對Python的調試配置
python的調試配置就簡單了很多,只需要指明要調試的文件即可。
在launch.json
的編輯窗口的右下角,有一個添加配置
的按鈕,點擊選擇Python
,選擇Python文件
就生成了一個調試當前活動文件的配置:
{
"name": "Python: 當前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
因此只需要program
字段選擇需要調試的文件即可,和前面c/c++的配置一樣,也支持通過args
字段給目標程序指定參數。
二 開始調試
1 選擇配置
我們前面創建了兩個配置,一個是編譯並調試當前活動的C源文件;一個是調試當前活動的Python文件。
在調試側邊欄中,可以選擇其中之一:
下面以調試當前Python文件爲例。
2 創建斷點
最簡單的斷點,在行號前面單擊即可創建。
vscode對於斷點有一些增強的功能。在創建的斷點上右鍵,選擇編輯斷點
,可以有以下幾個選擇:
- 表達式:當表達式的調試滿足時打斷
- 命中次數:當該斷點被命中指定次數時打斷
- 日誌消息:當每次斷點被命中時打印log,支持的格式類似Python的f-string,
{}
中加表達式打印時可以被替換
編輯好斷點的形狀會有一些變化,光標放在斷點上可以看到相關的信息:
如圖,該斷點會在i == 100
或者被命中50次時停下,並且每次命中都會在調試控制檯中輸出一次log。
3 開始調試
點擊調試配置左邊的開始按鈕即開始調試。
如下便是執行調試該Python文件的結果示例:
調試側邊欄中:變量窗口會有當前的所有變量,可以在某個感興趣的變量上右鍵選擇添加到監視
,那麼該變量就會出現在監視窗口中,方便我們觀察它的變化;調用堆棧窗口可以看到函數調用的堆棧信息。
在右上角的調試工具欄可以拖動,各個按鈕的功能鼠標放上去都有提示,不再介紹。
以上便是對vscode中進行代碼調試的介紹,更多的特性和功能可以在後續的時候中逐步熟悉,遇到問題可以留言或者查看官方文檔(針對不同語言的調試配置均有介紹)。