??往期內容回顧
????????Git 教程(初階)
????????基于Linux系統知識的第一個程序
????????自動化構建工具-make/Makefile
????????gcc/g++編譯及鏈接
????????Vim工具的使用
????????Linux常用工具(yum與vim)
一、??Linux 下的調試工具 GDB
????????一、為什么要學習 GDB?
-
????????調試是開發不可或缺的環節,無論是初學編程還是開發大型項目,都難免會遇到程序崩潰、邏輯錯誤、死循環等問題。
-
GDB(GNU Debugger)是 Linux/Unix 下最常用的命令行調試工具,能幫助你精確定位問題所在。
-
學會用 GDB,能極大提升排錯效率,節省大量調試時間。
-
對于理解程序運行機制、學習底層細節也很有幫助。
????????二、什么是 GDB?
-
GDB 是 GNU 項目下的調試器,用于調試用 C、C++、Fortran 等語言編寫的程序。
-
它允許你:
-
運行程序并監控執行過程
-
設置斷點暫停程序
-
查看變量和內存內容
-
單步執行代碼
-
跟蹤調用棧
-
修改變量值
-
-
GDB 是基于命令行的,但也有很多圖形前端(如 DDD、Nemiver、Eclipse 等)用來提升交互體驗
三、GDB 的基本使用
1. 編譯帶調試信息的程序
????????為了讓 GDB 能查看源碼信息,必須在編譯時加上?-g?參數:
gcc -g hello.c -o hello
原因:gcc/g++默認在編譯文件的時候,文件的版本為release版本,無法進行調試,在編譯時必須要 加上 -g允許gdb查看源碼才能進入調試模式。
gdb ./hello
2. 常用命令示例
命令 | 說明 |
---|---|
run?/?r | 啟動程序 |
break main?/?b main | 在 main 函數設置斷點 |
break 文件名:行號 | 在指定行設置斷點 |
next?/?n | 單步執行下一行(不進入函數內部) |
step?/?s | 單步執行,進入函數內部 |
continue?/?c | 繼續運行直到下一個斷點或程序結束 |
print 變量名?/?p | 打印變量值 |
info locals | 查看當前函數所有局部變量 |
backtrace?/?bt | 查看調用棧 |
list?/?l | 查看源碼(當前行附近) |
quit?/?q | 退出 GDB |
3、調試流程示例
(gdb) break main ? ? ? # 設置斷點
(gdb) break delete num? ? ? ?# 刪除第num個斷點
(gdb) run ? ? ? ? ? ? ?# 運行程序
(gdb) next ? ? ? ? ? ? # 執行下一行
(gdb) print x ? ? ? ? ?# 打印變量 x
(gdb) continue ? ? ? ? # 繼續執行
(gdb) backtrace ? ? ? ?# 查看調用棧
(gdb) quit ? ? ? ? ? ? # 退出(gdb) p &x ? ? ? ? ? #查看變量的地址
(gdb) display x ? #變量的常顯示
(gdb)until ? num? ? ? ? ? ? ? #跳出循環至下一次有效代碼行num
(gdb) set var?sum = 10 ? ? ? ?# 修改變量值
(gdb)info locals ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#查看局部變量
四、總結
優點 | 適用場景 |
---|---|
免費、開源、功能強大 | C/C++ 程序調試 |
支持斷點、單步執行、變量查看 | 定位程序崩潰和邏輯錯誤 |
支持多線程、遠程調試 | 復雜項目調試 |
有豐富的命令集和腳本支持 | 自動化調試流程 |
二、macos下的調試工具LLDB
????????一、macOS 的 LLDB 簡介
1. 什么是 LLDB?
-
LLDB?是 Apple 推出的調試器,屬于 LLVM 項目的一部分。
-
它是 macOS 和 iOS 平臺上的默認調試器,隨 Xcode 工具鏈安裝。
-
LLDB 設計現代化,支持最新的編譯器生成的調試信息(特別是 Clang/LLVM 生成的 DWARF)。
-
原生支持 ARM64 (Apple Silicon) 架構,支持多線程、異步編程調試。
2. LLDB 與 GDB 的關系
-
LLDB 最初是為了替代 GDB 在蘋果生態的地位而開發的。
-
LLDB 和 GDB 在命令行風格上有很多相似之處,但內部架構不同。
-
LLDB 使用現代 C++ 編寫,集成 LLVM,調試效率和對新架構的支持更好。
-
GDB 作為 GNU 項目,歷史悠久,跨平臺廣泛,但 macOS 上對最新 Apple 硬件和編譯器支持不如 LLDB。
二、macOS LLDB 的安裝和啟動
-
默認已經安裝:macOS 自帶 Xcode 或者 Xcode 命令行工具后,會自動安裝 LLDB。
-
啟動 LLDB:
lldb <program>
????????進入交互命令行界面,等待用戶輸入命令
三、LLDB 常用命令詳解
任務 | LLDB 命令示例 | 說明 | GDB 對應命令 |
---|---|---|---|
啟動程序 | run | 運行程序 | run?/?r |
設置函數斷點 | breakpoint set -n main?或?b main | 在函數名?main?處設置斷點 | break main |
設置行斷點 | breakpoint set -f file.c -l 42?或?b file.c:42 | 在文件?file.c?的第 42 行設置斷點 | break file.c:42 |
列出斷點 | breakpoint list?或?br list | 列出所有斷點 | info break |
刪除斷點 | breakpoint delete 1 | 刪除斷點編號 1 | delete 1 |
單步執行(不進入函數) | next?或?n | 單步執行,不進入函數 | next?/?n |
單步執行(進入函數) | step?或?s | 單步執行,進入函數 | step?/?s |
繼續執行 | continue?或?c | 繼續執行直到下一個斷點或程序結束 | continue?/?c |
打印變量 | print var?或?p var | 打印變量值 | print var?/?p var |
查看調用棧 | bt?或?thread backtrace | 查看當前調用棧 | backtrace?/?bt |
查看源碼 | list?或?l | 查看當前代碼 | list?/?l |
退出調試 | quit?或?q | 退出調試器 | quit?/?q |
四、LLDB 的高級功能介紹
1. 對多線程的支持
-
LLDB 支持查看線程列表,切換線程,查看線程狀態:
thread list thread select 2 thread info
-
GDB 也支持多線程,但 LLDB 對 macOS 和 ARM64 的線程調試更友好。
2. Watchpoint(監視點)
-
LLDB 支持對變量內存變化設置監視點:
watchpoint set variable myVar
-
適合調試內存相關錯誤。
3. 表達式求值和腳本
-
LLDB 支持用 Python 腳本擴展功能。
-
可以在調試時寫 Python 腳本執行復雜操作。
4. 代碼補全與命令歷史
LLDB 支持 tab 補全和命令歷史,比 GDB 交互體驗更好。
五、macOS LLDB 與 GDB 對比總結
特性/維度 | LLDB (macOS) | GDB (macOS) |
---|---|---|
默認安裝 | macOS 自帶,Xcode 自帶 | 需要自己安裝 |
支持架構 | 原生支持 ARM64 和 x86_64 | 主要支持 x86_64,ARM64 支持有限 |
調試符號支持 | 完美支持 Apple clang 生成的 DWARF 格式 | 對 Apple DWARF 支持不完全,常報錯 |
交互體驗 | 命令補全、腳本擴展、歷史記錄完善 | 較傳統,交互性不如 LLDB |
多線程調試 | 優秀 | 支持,但不如 LLDB 友好 |
腳本支持 | 支持 Python | 有腳本支持,但相對較弱 |
適用場景 | macOS 和 iOS 開發首選調試器 | Linux 和跨平臺項目常用 |
易用性 | 現代化,用戶體驗更好 | 歷史久遠,但命令更繁瑣 |
六、簡單 LLDB 調試流程示例
gcc -g -O0 gdb.c -o myprog ? # 編譯帶調試符號程序
lldb myprog ? ? ? ? ? ? ? ? # 啟動 lldb 調試器(lldb) b main ? ? ? ? ? ? ? # 在 main 函數設置斷點
(lldb) run ? ? ? ? ? ? ? ? ?# 運行程序
(lldb) n ? ? ? ? ? ? ? ? ? ?# 單步,不進入函數
(lldb) s ? ? ? ? ? ? ? ? ? ?# 單步,進入函數
(lldb) p var ? ? ? ? ? ? ? ?# 打印變量
(lldb) bt ? ? ? ? ? ? ? ? ? # 查看調用棧
(lldb) c ? ? ? ? ? ? ? ? ? ?# 繼續運行至下一個斷點b
(lldb) q ? ? ? ? ? ? ? ? ? ?# 退出(lldb) display x ? ? #變量的常顯示
(lldb)until ? num? ? ? ? ? ? ? #跳出循環至下一次有效代碼行num
(lldb) expr sum = 10 ? ? ? ?# 修改變量值
(lldb) frame variable ? ? ? ? #查看當前函數的所有局部變量
七、總結
-
在 macOS 上調試,強烈推薦用 LLDB。
-
LLDB 對 macOS 和 Apple Silicon 有天然支持,調試體驗比 GDB 好很多。
-
GDB 雖然經典且跨平臺,但在 macOS 上使用常碰到架構兼容性和調試信息格式問題。
-
如果你熟悉 GDB 命令,LLDB 也能快速上手,命令基本兼容,還支持更多現代功能。