本篇 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 也可以進行除錯,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
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
3hello 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