文档首页> Linux命令> 在Linux系统中使用gdb调试一个代码

在Linux系统中使用gdb调试一个代码

发布时间:2025-07-31 00:08       

以下是在Linux系统中使用GDB调试代码的专业指南,结合最新实践和核心调试技术,确保实用性和准确性:


一、环境准备

  1. 安装GDB

    sudo apt install gdb  # Debian/Ubuntu
    sudo yum install gdb  # CentOS/RHEL
    ​

    📌 验证安装:gdb --version(当前稳定版为13.2)

  2. 编译带调试信息的代码

    gcc -g -O0 -o my_program my_program.c  # -g 包含调试符号,-O0 禁用优化
    ​

    🔍 关键:无 -g则无法查看源码和变量。


二、核心调试流程

1. 启动GDB

gdb ./my_program  # 加载可执行文件
​

2. 设置断点(Breakpoints)

命令 作用
break main 在main函数入口设断点
break file.c:20 在file.c第20行设断点
break func_name 在特定函数处设断点
info breakpoints 查看所有断点
delete [编号] 删除断点

3. 运行程序

run arg1 arg2  # 传递命令行参数
start          # 停在main函数第一行(临时断点)
​

4. 逐行执行

命令 区别
next(n) 执行下一行(跳过函数调用)
step(s) 执行下一行(进入函数内部)
continue(c) 继续运行直到下一个断点

5. 查看数据

print variable    # 打印变量值
print *(array+5)  # 查看数组第6个元素
display variable  # 每次暂停时自动打印该变量
info locals       # 显示当前栈帧所有局部变量
​

6. 检查调用栈

backtrace (bt)    # 显示调用栈
frame [编号]      # 切换到指定栈帧
up/down           # 在栈帧间上下移动
​

三、高级调试技巧

1. 条件断点

break 30 if count > 100  # 当count>100时在第30行暂停
​

2. 观察点(Watchpoints)

watch variable   # 当变量被修改时暂停
rwatch variable  # 当变量被读取时暂停
​

3. 修改运行时数据

set variable = 10  # 修改变量值(用于绕过错误逻辑测试)
​

4. 多线程调试

info threads      # 查看所有线程
thread [ID]       # 切换到指定线程
break line thread all  # 在所有线程的某行设断点
​

四、实战案例:调试段错误(Segmentation Fault)

  1. 启用核心转储:
    ulimit -c unlimitedecho "core" > /proc/sys/kernel/core_pattern
    ​
  2. 运行程序触发崩溃后,用GDB分析:
    gdb ./my_program core  # 加载程序和核心转储文件
    ​
  3. 定位问题:
    backtrace        # 查看崩溃时的调用栈info registers   # 检查寄存器值(特别是eip/rip)x/10x $sp        # 查看栈内存
    ​

五、常用辅助命令

命令 用途
list(l) 显示源码(可带行号/函数名)
info proc mappings 查看进程内存映射
disassemble 反汇编当前函数
quit(q) 退出GDB

六、提高效率的技巧

  1. 使用 .gdbinit配置文件
    在 ~/.gdbinit中添加常用设置:

    set pagination off   # 禁用分页
    set history save on  # 保存命令历史
    ​
  2. TUI模式(文本用户界面)

    gdb -tui ./my_program  # 同时显示源码和汇编
    ​

    📌 快捷键:Ctrl+X+A 切换TUI模式

  3. 配合Valgrind检测内存错误

    valgrind --leak-check=full ./my_program
    ​

七、常见问题解决