gdb
(GNU Debugger) 是一个强大的调试工具,常用于调试 C、C++ 等程序。它可以帮助你在程序运行时分析、定位和解决各种问题(例如,崩溃、内存错误等)。下面是 gdb
的常见用法和基本操作,帮助你高效调试程序。
1. 启动 gdb
首先,你需要编译你的程序时加上调试信息,通常使用 -g
选项编译代码:
然后,使用 gdb
启动调试:
这将启动 gdb
,并加载你的可执行程序。
2. 常用 gdb 命令
1. 设置断点 (Breakpoints)
断点是调试的基础,允许你在程序的某一行暂停执行。
在函数入口设置断点:
在源代码的某一行设置断点:
在某个条件下设置断点:
2. 运行程序 (Run)
启动程序:
启动程序并传递参数:
3. 单步调试 (Stepping)
单步执行(进入函数):
单步执行(跳过当前函数):
跳到函数的返回:
4. 查看变量的值
查看变量的值:
查看指针指向的内容:
查看当前栈帧的局部变量:
查看函数的参数:
5. 继续执行 (Continue)
- 继续执行程序,直到下一个断点:
6. 查看调用栈 (Backtrace)
打印当前的调用栈:
打印调用栈的前
n
层:查看当前栈帧的信息:
7. 修改变量值
你可以在调试过程中修改变量的值:
- 修改变量:
8. 退出 gdb
退出 gdb
调试会话:
3. 其他常用 gdb 功能
1. 查看源代码
查看当前执行行的源代码:
查看指定位置的源代码:
2. 观察点 (Watchpoints)
观察点用于监视某个变量的变化。程序会在变量的值发生变化时暂停执行。
- 设置观察点:
3. 检查内存 (Memory)
查看某个内存地址的内容:
其中,
4xw
表示以 16 进制格式查看 4 个字(32 位)的内存。
4. 调试崩溃 (Core Dump)
如果程序崩溃并生成了 core dump
文件,你可以通过 gdb
进行调试:
这将加载程序和崩溃的核心转储文件,你可以使用 backtrace
等命令查看崩溃的位置。
5. 调试多线程程序
查看所有线程:
切换到某个线程:
查看当前线程的栈帧:
6. 其他有用命令
查看调试信息:打印调试信息(比如变量类型、函数信息等):
检查符号:
查看当前执行行:
禁用断点:
删除断点:
7. gdb 脚本
你可以编写 gdb
脚本(以 .gdb
或 .txt
为后缀),并通过 source
命令执行:
这允许你自动化调试流程,设置断点、查看变量等。
8.call stack(呼叫堆疊)
顯示 call stack(呼叫堆疊)是一個非常常見且有用的操作,這樣可以查看當前程式的執行流程,知道哪些函數被呼叫過,並且可以追蹤錯誤或程式崩潰時的堆疊情況。
顯示 Call Stack
要顯示 call stack,在 GDB 中使用 backtrace
命令(簡寫為 bt
)。這個命令會列出所有目前的堆疊框架,即從程式的當前執行點到主程式的呼叫歷程。
步驟:
啟動 GDB 並加載你的程式:
在 GDB 中設置斷點並運行程式:
當程式停在斷點或發生崩潰時,輸入以下命令來顯示 call stack:
或者你也可以使用簡寫:
這將顯示當前的呼叫堆疊,像這樣:
每一行表示一個堆疊框架,從當前執行的函數到最初的 main()
函數。
進階使用
顯示更詳細的堆疊信息:你可以使用
backtrace full
來顯示更多的本地變數資料:查看特定層級的呼叫堆疊:如果你只對某一層的堆疊信息感興趣,可以指定顯示的層數:
這會顯示最近 10 層的堆疊框架。
顯示單一堆疊層級的詳情:你可以查看特定層級的詳細資料,例如:
這會顯示第四層(堆疊的深度從 0 開始)的詳細資料。
檢視局部變數:在查看堆疊的同時,你也可以檢視當前層級的變數:
沒有留言:
張貼留言