GDB使用简述

一、GDB 基础使用流程

1. 编译程序(必须包含调试信息)
gcc -g -Og -o program program.c
# -g : 生成调试信息
# -Og : 优化调试体验的优化等级(推荐)
2. 启动GDB
gdb ./program # 启动调试
gdb -tui ./program # 启动时显示源代码窗口(TUI模式)
3. 常用调试命令
命令 作用 示例
b main main函数入口设置断点 b 25(第25行) b file.c:30
r 或 run 运行程序 r arg1 arg2(带参数运行)
n 或 next 单步执行(不进入函数)
s 或 step 单步执行(进入函数)
c 或 continue 继续运行至下一个断点
p var 打印变量值 p *array@10(打印数组前10个元素)
display var 每次暂停时自动显示变量
bt 或 backtrace 显示调用栈 bt full(显示局部变量)
finish 执行到当前函数返回
until 运行到循环结束/当前作用域外
q 或 quit 退出GDB

二、高级调试技巧

1. 条件断点
 
  

bash

b file.c:30 if i == 5 # 当i=5时在第30行暂停
2. 观察点(Watchpoint)
watch variable # 变量值改变时暂停
3. 修改内存
print *(int*)0x7fffffffdc30 = 42 # 直接修改内存地址的值
4. 跳转执行
jump line_number # 跳转到指定行继续执行
5. 信号处理
handle SIGSEGV stop # 段错误时自动暂停

三、核心转储分析(Core Dump)

1. 启用核心转储
ulimit -c unlimited # 解除核心转储文件大小限制
2. 生成并分析核心文件
# 程序崩溃后生成core文件(如core.1234)
gdb ./program core.1234
# 在GDB中执行:
bt # 查看崩溃时的调用栈
print var # 检查崩溃时的变量状态

四、内存调试工具 Valgrind

1. 安装(Ubuntu示例)
 
  

bash

sudo apt-get install valgrind
2. 基础用法
valgrind --leak-check=full ./program
# 常用选项:
--track-origins=yes # 追踪未初始化值的来源
--show-leak-kinds=all # 显示所有内存泄漏类型
--log-file=valgrind.log # 输出到文件

五、调试流程示例

  1. 编译gcc -g -Og -o test test.c
  2. 启动GDBgdb ./test
  3. 设置断点b main
  4. 运行r
  5. 单步调试n/s
  6. 检查变量p var
  7. 分析崩溃:若崩溃则bt查看调用栈
  8. 内存检查:使用Valgrind检测泄漏

六、常见问题解决

1. 断点未命中
  • 确认编译时添加了-g选项
  • 检查是否优化级别过高(改用-Og
  • 确保断点位置在可执行代码路径上
2. 段错误(Segmentation Fault)
# 方法1:通过GDB直接调试
gdb ./program
run
# 崩溃后输入:
bt
# 方法2:使用Valgrind定位
valgrind --tool=memcheck ./program
3. 多线程调试
# GDB中查看线程
info threads
thread 2 # 切换到线程2

通过以上步骤,可以系统地定位内存错误、逻辑错误和性能瓶颈。

你可能感兴趣的:(c++,C)