C++代码调试(gdb)

Linux系统gdb调试功能

gdb常用功能
支持的功能 描述
断点管理 设置断点、查看断点等
调试执行 逐语句、逐过程执行
查看数据 在调试状态下查看变量数据、内存数据等
运行时修改变量值 在调试状态下修改某个变量的值
显示源代码 查看源代码信息
搜索源代码 对源代码进行查找
调用堆栈管理 查看堆栈信息
线程管理 调用多线程程序,查看线程信息
进程管理 调试多个进程
崩溃转储(core dump)分析 分析core dump文件
调试启动方式 用不同的方式调试进程,比如加载参数启动、附加到进程等
调试执行
  • list / l

    • 查看代码
    • 查看断点附近的代码
  • r / run

    • 运行
  • set args

    • 设置参数(类似main函数的传参)
  • gdb attach [pid] // TODO:细看一下

  • 将gdb附加到已经跑起来的进程

  • b / break 设置断点

    break 文件名:行号

    • 普通断点
    • 条件断点
    • 数据断点

    为函数设置断点

    • break 函数名
    • 如果有多个函数名相同,只是参数不同,则gdb会为所有同名函数都设置断点
  • p / print

    • 查看变量的值
  • rb / rbreak

    • 使用正则表达式设置函数断点
  • b +(-)偏移量

    • 当前代码执行到某一行时,可为当前代码行的前面或者后面某一行设置断点
  • b 断点 条件

    • 设置条件断点

    • b demo:79 if i==900
      
  • b *指令地址

    • 在指令地址上设置断点(针对没有符号信息的调试程序)

    • # 先获取函数地址
      p main
      # 设置断点
      b * 0x400aa6
      
  • tb / tbreak 断点

    • 设置临时断点,只命中一次,然后会被自动删除,后续即使代码被多次调用也不会被调用
  • info b / info break(breakpoints) / i b

    • 查看断点状态
    • 也可以只查看某一个具体的断点,方法为在这些命令后面加上断点编号
启用/禁用断点
  • disable 断点编号
    • 禁用断点
  • enable 断点编号
    • 启用断点
  • enable once 断点编号
    • 启用断点一次
  • enable delete 断点编号
    • 启用断点并删除,即如果断点被启用,当下次命中该断点后,会自动删除。相当于把一个被禁用的断点转换为临时断点
  • enable count 数量 断点编号
    • 启用断点并命中N次,即启用断点后可以命中N次,但是命中N次后,该断点就会被自动禁用,不会再次命中
  • ignore 断点编号次数
    • 忽略断点前N次命中
删除断点
  • delete

    • 删除所有断点
  • delete 断点编号

    • 删除指定断点
  • delete范围

    • 删除指定范围的断点(可删除多个范围的断点)

    • delete 5-7 10-12
      
  • clear 函数名

    • 删除指定函数的断点(如果有多个同名函数断点,则这些断点都会被删除)
  • clear 行号

    • 删除指定行号的断点
    • 删除断点命令clear和delete是有区别的。delete是全局的,不收栈帧的影响,clear命令受到当前栈帧的影响,删除的是将要执行的下一处指令的断点。delete命令可以删除所有断点,包括观察点和捕获点;clear命令不能删除观察点和捕获点

删除断点命令clear和delete是有区别的。delete是全局的,不收栈帧的影响,clear命令受到当前栈帧的影响,删除的是将要执行的下一处指令的断点。delete命令可以删除所有断点,包括观察点和捕获点;clear命令不能删除观察点和捕获点

Logo

一站式 AI 云服务平台

更多推荐