C/C++Unix/Linux应用层编程基本原理,系统编程基础

使用GDB调试程序的完整指南

GDB调试命令终极指南:从基础到进阶

一、源码查看与分屏模式

  1. 查看源码片段
    list [行号/函数名](简写l)显示指定位置的代码片段,默认每次展示10行。例如:

    (gdb) l main.c:20  # 显示main.c第20行附近的代码
    (gdb) l my_func    # 查看my_func函数的源码

    分屏模式:通过cgdb工具或gdb -tui命令启动分屏界面,上方显示源码,下方为调试命令窗口。按Esc切换代码屏,i返回调试屏。

或输入以下命令

       layout src  #以图形化窗口打开源码
       ctrl+x A    #关闭图形化窗口
  1. 源码路径指定
    若项目源码分散在多目录,使用directory <路径>添加搜索路径,show directories查看当前路径列表。

二、断点管理

  1. 设置断点
    • 基础断点:

    (gdb) b 30        # 第30行设置断点
    (gdb) b my_func   # 函数入口断点
    (gdb) b *0x400504 # 内存地址断点

    条件断点break 45 if i==100,当变量i为100时触发。
    观察点watch var监控变量值变化,rwatch var监控变量被读取。

  2. 断点操作
    info break查看所有断点,delete <编号>删除断点。
    disable/enable <编号>临时禁用/启用断点。

三、程序执行控制

  1. 运行与继续
    run(简写r)启动程序,continuec)继续执行至下一断点。
    单步执行

    (gdb) next    # 逐过程(不进入函数)
    (gdb) step    # 逐语句(进入函数)
    (gdb) finish  # 执行完当前函数并返回
    (gdb) until 100 # 运行至第100行(跳出循环常用)
  2. 跳转与强制返回
    jump 50跳转到第50行继续执行。
    return <值>强制从当前函数返回指定值。

四、变量追踪与内存分析

  1. 查看变量
    print varp)显示变量值,ptype var查看类型。
    格式化输出

    (gdb) p/x var   # 十六进制显示
    (gdb) p/d array@10 # 显示数组前10个元素
  2. 持续追踪
    display var每次暂停时自动显示变量。
    x/<格式> <地址>查看内存,如x/20xw 0x7fffffffe000显示20个4字节十六进制值。

五、堆栈分析

  1. 调用栈查看
    backtracebt)显示完整调用栈,frame <编号>切换栈帧。
    info frame查看当前栈帧的寄存器、局部变量等信息。
  2. 栈破坏调试
    结合info registers检查寄存器值,x命令分析内存是否越界。

六、多线程调试

  1. 线程管理
    info threads显示所有线程,thread <ID>切换调试线程。
    线程锁定

    (gdb) set scheduler-locking on  # 仅当前线程运行
    (gdb) set scheduler-locking step # 单步时锁定其他线程
  2. 死锁排查
    • 使用info mutex查看锁状态,在锁操作处设置条件断点。
    • 示例:break pthread_mutex_lock if mutex_id==0x1234

七、大型项目调试技巧

  1. 附加到运行进程

    gdb attach <PID>       # 附加到正在运行的进程
    gdb -p <PID>           # 直接调试目标进程
  2. Core Dump分析
    • 生成Core文件:ulimit -c unlimited
    • 加载分析:gdb program core,结合btinfo registers定位崩溃点。
  3. 宏调试
    编译时添加-g3选项,info macro MACRO_NAME查看宏定义。

八、高级命令速查表

场景命令示例
条件断点b 50 if i>100
监控指针解引用watch *(int*)0x7fffffffe3cc
多线程断点b func thread all
批量执行命令thread apply all bt
查看优化后变量set print frame-arguments all

通过上述命令组合,可高效应对C/C++项目的复杂调试场景。建议结合gdb -batch -x commands.gdb编写自动化调试脚本,提升效率。

回复

This is just a placeholder img.