GDB断点

Linux编程基础——GDB(设置断点)

Linux编程基础——GDB(设置断点)

启动GDB后,首先就是要设置断点,程序中断后才能调试。在gdb中,断点通常有三种形式:

断点(BreakPoint):

在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式:

break 在进入指定函数时停住
break 在指定行号停住。
break +/-offset 在当前行号的前面或后面的offset行停住。offiset为自然数。
break filename:linenum 在源文件filename的linenum行处停住。
break … if …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令:

delete 删除所有断点
delete breakpoint [n] 删除某个断点
disable breakpoint [n] 禁用某个断点
enable breakpoint [n] 使能某个断点
观察点(WatchPoint):

在变量读、写或变化时中断,这类方式常用来定位bug。

watch 变量发生变化时中断
rwatch 变量被读时中断
awatch 变量值被读或被写时中断
可以通过info watchpoints [n]命令查看当前观察点信息

捕捉点(CatchPoint):

捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。

捕捉点的命令格式是:catch ,event可以是下面的内容

throw C++抛出的异常时中断
catch C++捕捉到的异常时中断
exec 调用系统调用exec时(只在某些操作系统下有用)
fork 调用系统调用fork时(只在某些操作系统下有用)
vfork 调用系统调用vfork时(只在某些操作系统下有用)
load 或 load 载入共享库时(只在某些操作系统下有用)
unload 或 unload 卸载共享库时(只在某些操作系统下有用)
另外,还有一个tcatch ,功能类似,不过他只设置一次捕捉点,当程序停住以后,应点被自动删除。

捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。

在特定线程中中断

你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread

break thread if …

linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如:

 (gdb) break frik.c:13 thread 28 if bartab > lim

当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。

恢复程序运行和单步调试

在gdb中,和调试步进相关的命令主要有如下几条:

continue 继续运行程序直到下一个断点(类似于VS里的F5)
next 逐过程步进,不会进入子函数(类似VS里的F10)
setp 逐语句步进,会进入子函数(类似VS里的F11)
until 运行至当前语句块结束
finish 运行至函数结束并跳出,并打印函数的返回值(类似VS的Shift+F11)
PS:这些命令大部分可以简写为第一个字母,在日常使用过程中,往往只会输入第一个字符即可执行该命令,我标红的即是通常的使用方式。这几条命令使用非常频繁,并且可以带一些附加参数以实现高级功能,需要熟练掌握

### 如何在 GDB 中设置和使用断点 #### 设置断点GDB 中可以通过多种方式来设置断点。以下是几种常见的方法: - **按行号设置断点** 可以通过 `break` 或缩写 `b` 来指定某一行作为断点位置。例如,如果要在第 10 行设置断点,则可以输入 `(gdb) break 10`[^4]。 - **按函数名设置断点** 如果知道程序中有某个特定的函数名称,可以直接针对该函数入口设置断点。例如,要为名为 `my_function` 的函数设置断点,可输入 `(gdb) break my_function`。 - **设置条件断点** 当希望仅在满足某些条件下才触发断点时,可以定义条件表达式。例如,假设有一个变量 `i`,当其值等于 50 时停止运行,那么可以这样操作:`(gdb) condition 1 i == 50`[^5]。 #### 查看断点信息 为了确认当前已有的断点及其状态,可以使用如下命令: ```bash (gdb) info breakpoints ``` 此命令会显示所有已经设定好的断点列表,包括它们的状态(启用/禁用)、地址、所在文件及具体行数等详细资料[^3]。 #### 控制断点的行为 除了简单的创建外,还可以进一步调整各个断点的工作模式: - **忽略首次触碰** 若不希望立即因新设下的断点而中断执行流程,而是让其跳过前几次命中机会后再生效的话,可以用到 `ignore` 指令。比如使编号为 1 的断点忽视最初的十次到达情况,应键入 `(gdb) ignore 1 10`[^1]。 - **临时关闭与重新激活** 对于那些暂时不需要但又不想彻底移除掉的断点来说,“disable” 和 “enable” 是非常实用的一对功能。分别对应着暂停作用以及恢复正常使用这两个动作。 - 关闭断点:`(gdb) disable <number>` - 开启断点:`(gdb) enable <number>` - **清除不再需要的断点** 删除单个或者多个不必要的断点有助于保持工作区整洁高效。有三种主要途径实现这一点: - 根据唯一标识符删除:`(gdb) delete <number>` - 针对接近目标区域内的所有项目一并清理:`(gdb) clear function_name_or_line_number` #### 实际案例演示 假设有这样一个简单 C++ 程序片段用于练习上述知识点: ```cpp #include <iostream> using namespace std; int main(){ int a=0; while(a<10){ cout << "Value of A is "<<a<<endl; ++a; } return 0;} ``` 按照常规步骤启动调试环境之后, ```bash $ gdb ./demo_program ``` 接着尝试添加几个不同类型的断点测试效果吧!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值