LLDB 除錯教學

本篇 ShengYu 介紹 LLDB 除錯教學,LLDB Debugger 是 LLVM 專案的除錯元件。在使用 Debugger 時可以單步執行、執行到中斷點、查看變數內容、印出呼叫堆疊等等功能,是程式設計師的常用工具,以下將會介紹編譯完 C/C++ 程式後怎麼使用 LLDB 來替 C/C++ 程式偵錯。

以下 LLDB 除錯教學的內容大概分為這幾部分,

  • clang/clang++ 編譯 C/C++ 程式
  • LLDB 進行除錯

那我們開始吧!

clang/clang++ 編譯 C/C++ 程式

我的桌機環境為 Ubuntu 16.04,以下為一個簡單的 C/C++ 程式,使用 clang++ main.cpp -g -o a.out 進行編譯,編譯成功後會產生 a.out 執行檔,-g 表示帶有除錯資訊,這邊當然也可以使用 gcc/g++ 去編譯 C/C++ 程式 (g++ main.cpp -g -o a.out),gcc/g++ 編譯後的程式 LLDB 也可以進行除錯,

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// clang++ main.cpp -g -o a.out
#include <iostream>
#include <string>

int main() {
std::string s = "hello world";

int sum = 0;
for (int i = 0; i < 5; i++) {
sum += i;
}

std::cout << s << "\n";
std::cout << "sum=" << sum << "\n";
std::cout << "end\n";

return 0;
}

程式輸出如下,

1
2
3
hello world
sum=10
end

LLDB 進行除錯

接著使用 lldb 指令對 a.out 進行除錯,執行 lldb ./a.out 指令進入 lldb 交互介面,

1
2
3
4
$ lldb ./a.out 
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb)

輸入 b main.cpp:14 插入中斷點在 main.cpp 的 14 行,

1
2
3
(lldb) b main.cpp:14
Breakpoint 1: where = a.out`main + 188 at main.cpp:14, address = 0x0000000000400c2c
(lldb)

輸入 b 印出目前設定的中斷點,這個指令跟 gdb 有所不同,

1
2
3
4
5
6
(lldb) b
Current breakpoints:
1: file = 'main.cpp', line = 14, exact_match = 0, locations = 1
1.1: where = a.out`main + 188 at main.cpp:14, address = a.out[0x0000000000400c2c], unresolved, hit count = 0

(lldb)

按下 r 開始執行,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
(lldb) r
Process 24479 launched: './a.out' (x86_64)
hello world
Process 24479 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
frame #0: 0x0000000000400c2c a.out`main at main.cpp:14
11 }
12
13 std::cout << s << "\n";
-> 14 std::cout << "sum=" << sum << "\n";
15 std::cout << "end\n";
16
17 return 0;
(lldb)

再次輸入 b 印出目前設定的中斷點,可以看到中斷點被觸發幾次,

1
2
3
4
5
6
(lldb) b
Current breakpoints:
1: file = 'main.cpp', line = 14, exact_match = 0, locations = 1, resolved = 1, hit count = 1
1.1: where = a.out`main + 188 at main.cpp:14, address = 0x0000000000400c2c, resolved, hit count = 1

(lldb)

接著按 c 繼續執行直到程式結束,

1
2
3
4
5
6
(lldb) c
Process 24479 resuming
sum=10
end
Process 24479 exited with status = 0 (0x00000000)
(lldb)

以下為 lldb 常用的指令,
r:run 開始執行
c:continue 繼續執行
b main.cpp:14:設定中斷點
b:印出目前設定的中斷點(這個指令跟 gdb 有所不同)
po <變數名稱>:印出目前變數的值,例如:po sum
bt:backtrace 印出程式呼叫的堆疊
q:quit 離開

以上就是 LLDB 除錯教學介紹,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

其他參考
LLDB 玩樂筆記. 最近在寫 uTensor 的 CNN Demo 文章,code 是可以… | by Dboy Liao | Medium
https://dboyliao.medium.com/lldb-%E7%8E%A9%E6%A8%82%E7%AD%86%E8%A8%98-f5f5d5ed89ff

相關主題
gdb 除錯教學
gdbserver 遠端除錯教學