vscode實戰:代碼調試

寫代碼難免有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.jsontask.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 生成活動文件"
        }
    ]
}

理解其中字段的含義,後續就可以依葫蘆畫瓢編寫自己的配置,關鍵字段的含義如下:

  1. name:配置的名字,可以存在不同配置,一般是一個調試目標有一個配置(顯示在調試側邊欄上下拉選擇列表中);
  2. type:表明調試器的類型,使用Visual Studio Windows Debuger的時候必須是cppvsdbg;使用GDB或者LLDB時爲cppdbg
  3. request:表明是執行(launch)目標程序,還是連接(attach)已有的實例;
  4. program:表明調試的目標程序;
  5. args:執行目標參數需要的參數,格式爲json列表;
  6. cwd:目標程序執行的工作目錄;
  7. MIMode:表明使用的調試器,gdb或者是lldb
  8. 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的名字就可以了。

其他幾個字段的含義:

  1. type:表明task的類型;
  2. options:就是一些其他可選的設置;
  3. 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對於斷點有一些增強的功能。在創建的斷點上右鍵,選擇編輯斷點,可以有以下幾個選擇:

  1. 表達式:當表達式的調試滿足時打斷
  2. 命中次數:當該斷點被命中指定次數時打斷
  3. 日誌消息:當每次斷點被命中時打印log,支持的格式類似Python的f-string,{}中加表達式打印時可以被替換

編輯好斷點的形狀會有一些變化,光標放在斷點上可以看到相關的信息:

如圖,該斷點會在i == 100或者被命中50次時停下,並且每次命中都會在調試控制檯中輸出一次log。

3 開始調試

點擊調試配置左邊的開始按鈕即開始調試。

如下便是執行調試該Python文件的結果示例:

調試側邊欄中:變量窗口會有當前的所有變量,可以在某個感興趣的變量上右鍵選擇添加到監視,那麼該變量就會出現在監視窗口中,方便我們觀察它的變化;調用堆棧窗口可以看到函數調用的堆棧信息。

在右上角的調試工具欄可以拖動,各個按鈕的功能鼠標放上去都有提示,不再介紹。

以上便是對vscode中進行代碼調試的介紹,更多的特性和功能可以在後續的時候中逐步熟悉,遇到問題可以留言或者查看官方文檔(針對不同語言的調試配置均有介紹)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章