在 VSCode 中使用 LLDB 進行除錯

jtsai1120

背景

以前聽說過 Debugger 工具,但實際上從來沒有使用過。
最近倒是因為資結重新開始碰 C++,但過程時常找不到 Bug 而煩躁,所以決定趁這個機會學一下 Debugger。

LLDB

相較於較常見的 GDB (From GNU Toolchain),這裡我使用的是 LLVM Toolchain 的 LLDB
理由是

  1. 目前 C++ 主要是使用 Macbook 在寫,而 MacOS 本身就有預設的 LLVM Toolchain,所以就使用 LLDB 了
    不過聽老大說 macOS 自帶的 LLVM Toolchain 版本過於老舊且有被官方魔改過,
    因此建議先用 brew 進行更新,
    且安裝完要讓 Mac 更新 LLVM Toolchain 的 Link,不然仍然會被導到系統內建舊的 bin/
    brew link --force --overwrite llvm
    (或者照 brew info 上寫的,在,在 shell 上加上兩個環境變數也可)
  2. 也是聽老大說 CLI 比 GDB 好看,不過我沒有這個需求

此外,因為我很懶,所以不打算使用 CLI Commands,而是直接使用 VSCode 內建的 GUI Debug Interface

配置過程

  1. 寫好目標程式檔 main.cpp
  2. 使用 -g 選項編譯 main.cpp (這邊用 g++ 而非 clang++ 編譯,仍然可用於 LLDB)
    1
    $ g++ -g main.cpp -o main

    info

    -g 選項是用來指示 g++ 生成專門給 Debugger 的調試訊息,包含比如:

    • 行數
    • 變量的位置
    • Program Counter 對應到的行數
  3. 在 VSCode 打開指令面板,輸入 >Debug: Add Configuration 新增 launch.json
  4. 新增 LLDB 的 Configuration
  5. 修改 program 選項的值到執行檔:${workspaceFolder}/main
  6. 配置完成打開 VSCode 的 Debug 面板,可以在程式碼中新增斷點,即可嘗試執行 LLDB!

常用功能

引用老大的筆記內容

Breakpoints

中斷點
可以在 BREAKPOINTS 欄位中加入如 Function Breakpoints,即在進入特定函數前中斷,
或者直接在特定程式碼行的前方加入中斷點

Next

單步執行,遇到函數不會進入

Step

單步執行,遇到函數會進入

Exception

LLDB 會幫我們自動接 Exception,顯示是哪裡發生什麼問題,免受 Segmentation Fault 之苦