linux下gdb怎么调试程序
linux下gdb怎么调试程序详细介绍
在 Linux 下使用 GDB 调试程序,需遵循以下核心步骤(附基础操作示例):
一、准备调试程序
1. 编译时保留调试信息
必须使用 -g 选项编译代码,否则 GDB 无法关联源码:
bash
gcc demo demo.cg++ demo demo.cpp
2. 启动 GDB
bash
gdb ./demogdb
二、基础调试命令(以 C 程序为例)
假设代码如下(保存为 demo.c):
c
a b a b
x y
sum x y
sum
1.
设置断点
- 在指定行号打断点:
(gdb) break demo.c:7(在main函数第 7 行暂停) - 在函数名处打断点:
(gdb) break main或(gdb) b add - 条件断点(仅当
x>10时触发):(gdb) break demo.c:7 if x>10
2.
运行程序
- 开始运行(遇断点暂停):
(gdb) run或(gdb) r
(可附加参数:r 10 20)
3.
单步执行
- 跳过函数(Step Over):
(gdb) next或(gdb) n(第 7 行的add会被当作一行执行) - 进入函数(Step Into):
(gdb) step或(gdb) s(会进入add函数内部)
4.
查看变量
- 打印变量值:
(gdb) print x或(gdb) p sum - 持续监控变量(自动更新):
(gdb) watch x
5.
查看调用栈
- 查看当前栈帧:
(gdb) backtrace或(gdb) bt - 切换栈帧(如进入
add后查看调用者):(gdb) frame 0(0 为主函数栈帧,1 为add栈帧)
6.
继续执行
- 继续运行到下一个断点:
(gdb) continue或(gdb) c - 运行到当前行的下一行(无需断点):
(gdb) until或(gdb) u(适合循环跳过)
三、常用进阶技巧
- 查看源码
(gdb) list或(gdb) l(默认显示当前断点附近代码) - 修改变量值
在调试暂停时修改变量:(gdb) set var x = 30(将x改为 30,立即生效) - 调试崩溃程序
- 生成核心转储文件:
先执行ulimit -c unlimited,再运行程序使其崩溃,生成core文件。 - 用 GDB 加载核心文件:
gdb ./demo core,通过bt查看崩溃时的栈帧。
- 生成核心转储文件:
- 远程调试
配合gdbserver调试远程服务器程序:
bashgdbserver :1234 ./demo
gdb ./demo
gdb target remote 服务器IP:1234
四、示例完整流程
bash
gcc demo demo.c
gdb ./demo
gdb b main
gdb r
gdb n
gdb s
gdb p a
gdb c
gdb p
gdb q
常见问题
- 无调试信息:报错
No symbol table loaded→ 检查是否遗漏-g编译选项。 - 断点无效:确保断点行号正确,或代码已编译到目标文件中。
- 程序卡住:使用
Ctrl+C暂停,查看当前栈帧(bt)分析阻塞原因。
通过以上命令,可覆盖 90% 的日常调试需求。GDB 还有更多高级功能(如宏调试、多线程调试),可根据具体场景进一步学习。