五.GDB保存断点

今天使用gdb调试了一整天,在好多关键的地方添加了断点,快要下班的时候,因为要关闭远程连接,为了便于明天继续测试,我想把所有的断点都 保存下来。但是因为断点太多了,使用“info b”虽然可以查看到断点,但是,断点的位置得自己找出来,然后保存,感觉有点麻烦。


(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040336d in main(int, char**) at RecvMain.cpp:290
breakpoint already hit 1 time
2 breakpoint keep y 0x00002aaab049c7ef in CRealCreditEventAb::LoopEventCreditCtrl(int)

……




上网想查看一下gdb是否有保存断点的方式,不过值搜到了“python 保存断点”的方法,看到使用“save breakpoints”命令,所以我来到gdb调试环境,查看了gdb是否有参数“save”,如下:

(gdb) save
“save” must be followed by the name of a save subcommand.
List of save subcommands:

save breakpoints – Save current breakpoint definitions as a script
save gdb-index – Save a
save tracepoints – Save current tracepoint definitions as a script

Type “help save” followed by save subcommand name for full documentation.
Type “apropos word” to search for commands related to “word”.
Command name abbreviations are allowed if unambiguous.
(gdb)




看到的确有“save breakpoints ”,禁不住窃喜,使用help查看该命令的含义:

(gdb) help save breakpoints
Save current breakpoint definitions as a script.
This includes all types of breakpoints (breakpoints, watchpoints,
catchpoints, tracepoints). Use the ‘source’ command in another debug
session to restore them.
(gdb)




看了一下解释,果然可以满足我的要求——把所有的断点进行保存,保存到“gdb.cfg”中,如下:

(gdb) save breakpoints gdb.cfg
Saved to file ‘gdb.cfg’.
(gdb) ^Z
[1]+ Stopped gdb RecvMain
[billing_dx@bmcs1 creditctl]$vi gdb.cfg

1 break main
2 break CRealCreditEventAb::LoopEventCreditCtrl
3 break AssignStopTask
……




最前面的是显示的行号,可以看到,我的断点的确保存了。



我又仔细看了一下上面的对于“save breakpoints”的注释,在另一个gdb session中可以使用“source”命令restore(恢复,还原)它们(断点)。测试一下:先删除所有断点,然后使用source恢复所有保存的断点,如下:

(gdb) D                                                #删除所有断点
Delete all breakpoints? (y or n) y
(gdb) info b #查看断点
No breakpoints or watchpoints.
(gdb) source gdb.cfg #加载断点
Breakpoint 9 at 0x40336d: file RecvMain.cpp, line 290.
Breakpoint 10 at 0x2aaab049c7ef: file CRealCreditEventAb.cpp, line 80.
……

(gdb) info b #查看断点
Num Type Disp Enb Address What
9 breakpoint keep y 0x000000000040336d in main(int, char**) at RecvMain.cpp:290
10 breakpoint keep y 0x00002aaab049c7ef in CRealCreditEventAb::LoopEventCreditCtrl(int)
at CRealCreditEventAb.cpp:80
……






多看一眼说明文档,又学到一个新的技巧,记录下来,希望对大家有帮助。



扩展阅读: http://ccshell.com/archives/92.html  python 保存断点

<think>好的,我需要帮助用户了解如何在C++中使用GDB设置断点。首先,用户之前的问题是关于查看可执行程序符号表的方法,现在转向断点设置,这可能是因为他们在调试过程中遇到了符号相关的问题,或者需要更深入的调试技巧。 用户提供的引用内容提到了断点设置的不同方法,包括按线程、函数名、行号、条件和正则表达式设置断点,以及查看和管理断点的方法。我需要将这些信息整合成一个结构清晰的教程,确保涵盖基本和高级用法。 首先,我需要确定用户可能的背景。他们可能是有一定C++编程经验的开发者,但在使用GDB进行调试时遇到困难,特别是在设置断点方面。可能需要从基础开始,逐步介绍各种断点设置方法,同时结合实际示例,让用户更容易理解。 接下来,我需要组织内容。通常,教程的结构应该从简单到复杂。先介绍基本断点设置,如函数名和行号,然后是条件断点、临时断点,再是高级功能如线程特定断点和正则表达式匹配。最后,讲解如何管理断点,比如查看、删除、禁用等。 同时,用户提供的引用中提到了一些具体命令,如`break main`、`b 9`、`condition`等,这些需要详细解释,并给出示例。还要注意GDB版本可能带来的差异,但假设用户使用的是较新版本,兼容这些命令。 另外,用户可能遇到的一些常见问题,比如断点不生效,可能的原因是什么,如何排查,比如检查符号是否正确加载,编译时是否包含调试信息(-g选项)。这些也需要在教程中提及,帮助用户避免常见陷阱。 还需要考虑用户可能的应用场景,比如多线程调试,这时候设置线程特定断点就很有用。或者调试大型项目时,使用正则表达式设置多个断点,提高效率。 最后,确保语言简洁明了,步骤清晰,每个部分都有示例代码和解释,方便用户跟随操作。可能还需要提示一些实用技巧,比如使用`info breakpoints`查看断点状态,使用`disable`和`enable`管理断点,以及如何保存断点配置等。 总结来说,我需要将用户提供的引用内容整合成一个全面的GDB断点设置教程,涵盖基本到高级功能,结合实际示例和常见问题解决方案,确保用户能够有效应用这些技巧进行C++程序的调试。</think>### C++项目中使用GDB设置断点的完整指南 --- #### **一、基础断点设置** ##### 1. 按函数名设置断点 ```gdb (gdb) break main # 在main函数入口设置断点 (gdb) b MyClass::method # 在类的成员函数设置断点 (gdb) b namespace::func # 在命名空间函数设置断点[^1] ``` *示例调试STL容器:* ```gdb (gdb) b std::vector<int>::push_back # 跟踪vector的插入操作 ``` ##### 2. 按行号设置断点 ```gdb (gdb) b 20 # 当前文件第20行 (gdb) b src/utils.cpp:45 # 指定文件的特定行[^3] ``` *验证符号加载:* ```gdb (gdb) info line src/utils.cpp:45 # 查看该行是否关联有效代码 ``` ##### 3. 按地址设置断点 ```gdb (gdb) b *0x401550 # 在内存地址设置断点 (gdb) b *&global_var # 在全局变量地址设置访问断点 ``` --- #### **二、高级断点控制** ##### 1. 条件断点(重点功能) ```gdb (gdb) b 35 if count > 100 # 基本条件判断 (gdb) b MyClass::validate() if ptr==0 # 结合类成员变量 (gdb) condition 2 (x%2)==0 # 修改2号断点的条件[^3] ``` *复杂条件示例:* ```gdb (gdb) b 89 if (strcmp(buffer,"ERROR")==0) && (errno == EINVAL) ``` ##### 2. 临时断点(单次触发) ```gdb (gdb) tbreak 15 # 触发一次后自动删除 (gdb) tbreak init_system if !initialized # 配合初始化状态检测 ``` ##### 3. 线程特定断点 ```gdb (gdb) b worker.cpp:33 thread 2 # 仅在2号线程生效 (gdb) b mutex_lock thread 1-4 # 在1-4号线程生效[^1] ``` --- #### **三、智能断点策略** ##### 1. 正则表达式批量设置 ```gdb (gdb) rbreak MyFactory::create* # 匹配所有create开头的方法 (gdb) rbreak .*::validate # 匹配所有类的validate方法[^3] ``` ##### 2. 观察点(数据断点) ```gdb (gdb) watch global_counter # 变量写入时中断 (gdb) watch *(int*)0x7fffffffe314 # 监控指定内存地址 (gdb) awatch buffer_ptr # 读写时均中断(访问观察点) ``` ##### 3. 事件断点 ```gdb (gdb) catch throw # 捕获所有异常抛出 (gdb) catch syscall open # 拦截系统调用 (gdb) catch fork # 跟踪进程分叉事件 ``` --- #### **四、断点管理技巧** ##### 1. 断点状态查看 ```gdb (gdb) info break [n] # 查看所有/指定断点 (gdb) i b # 简写命令 ``` *典型输出解析:* ``` Num Type Disp Enb Address What 1 breakpoint keep y 0x000055555555516a in main() at demo.cpp:8 breakpoint already hit 3 times cond 1 (x > 100) # 显示附加条件 ``` ##### 2. 断点维护操作 ```gdb (gdb) disable 3-5 # 禁用3-5号断点 (gdb) enable once 2 # 仅启用2号断点一次 (gdb) ignore 4 10 # 忽略4号断点前10次触发 (gdb) save breakpoints bp.conf # 保存断点配置[^2] ``` ##### 3. 断点自动执行命令 ```gdb (gdb) commands 2 > print buffer[0] > backtrace > continue > end ``` --- #### **、调试场景示例** ##### 案例:多线程数据竞争调试 ```gdb (gdb) b worker_thread() thread 3 if shared_flag # 特定线程条件断点 (gdb) watch -l shared_data # 监控共享数据变化 (gdb) set scheduler-locking step # 调试时锁定其他线程 ``` ##### 案例:STL容器异常分析 ```gdb (gdb) b __throw_bad_alloc # 捕获内存分配异常 (gdb) b std::vector<int>::_M_range_check # 越界访问检测 ``` --- ### 常见问题排查 1. **断点显示但未触发** - 检查编译时是否包含`-g`选项:`objdump --dwarf=info program | grep DW_TAG_compile_unit` - 验证代码优化级别:`-O0`确保代码未被优化删除 2. **条件断点性能低下** 使用硬件观察点提升速度: ```gdb (gdb) hbreak 45 if x>100 # 硬件辅助断点 ``` 3. **动态库断点失效** 强制加载符号: ```gdb (gdb) set stop-on-solib-events 1 (gdb) run # 当库加载时暂停 (gdb) sharedlibrary # 重新加载符号 ``` --- [^1]: GNU调试器手册-断点设置章节 [^2]: GDB官方文档-断点保存与恢复 : ELF调试技术深度解析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值