【早期笔记】C++代码调试(gdb)
C++代码调试(gdb)文章目录C++代码调试(gdb)Linux系统gdb调试功能gdb常用功能调试执行启用/禁用断点删除断点Linux系统gdb调试功能gdb常用功能支持的功能描述断点管理设置断点、查看断点等调试执行逐语句、逐过程执行查看数据在调试状态下查看变量数据、内存数据等运行时修改变量值在调试状态下修改某个变量的值显示源代码查看源代码信息搜索源代码对源代码进行查找调用堆栈管理查看堆栈信息
·
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命令不能删除观察点和捕获点
更多推荐




所有评论(0)