GDB调试一

it2025-09-29  3

GDB调试一

breakpoints

内置变量$bpnum记录了当前设置的断点号;每次设置断点时,GDB会赋当前最大max_breakpoint_num+1给$bpnum。infos breakpoints可以查看所有的断点。

break 为当前栈下一条指令设置断点。break location 在location处设置断点,location可以是: [filename:]function 在函数入口处设置一个断点。如果C++的存在多个重载函数,break function命令会列出所有的重载版本,当输入对应序号(可多选)可为相应函数设置断点。也可以通过break function(types) 为具体某一个重载版本设置断点。文件名忽略时,源文件默认为当前源文件。+offset(break -offset) 相对于当前行进行偏移并设置断点。[filename:]linenum 在文件所filename中linenum行设置断点。文件名忽略时,源文件默认为当前源文件。address 对某个函数地址设置断点, 例如break *0xffff2323。 break … if cond 三点号“…”可以是空或者location。每次到达此命令设置的断点时,计算cond的值,如果计算结果非零则中断程序。tbreak 与break命令类似,区别在于命中断点时断点自动被删除。hbreak 设置一个硬件断点,需要硬件支持。thbreak 具有tbreak与hbreak的特点rbreak [filename:]regex 正则表达式regex所匹配到的所有函数都会设置断点。正则表达式语法跟grep类似,例如rbreak func(double.*。

watchpoints

watchpoints也叫数据断点(watchpoints是以软件方式还是硬件方式实现的取决于你的系统),用于监控表达式,表达式类似于C/C++的表达式。软件方式实现的watchpoints性能比硬件方式的低很多,因为每执行一行代码都会去检测变量的值是否改变,并且只适用于单线程。如果是硬件类型的watchpoints,被监控的表达式的字节宽度不能超过硬件中断可处理的最大字节宽度。 当被监控的局部变量或者表达式里面所涉及的变量超出作用域时,watchpoint会自动被删除。

watch [-l|-location] expr [thread thread-id] [mask maskvalue] 当expr里变量值发生改变时,中断程序。设置thread-id时,即只有thread-id所代表的线程改变表达式的值时,才会中断,但只限于硬件方式实现。指定*-localtion*参数,gdb通过计算expr的内存地址,转为监控此内存地址,即使变量离开了作用域,watchpoint也不会被删除,如果表达式结果不存在地址则提示错误。rwatch [-l|-location] expr [thread thread-id] [mask maskvalue] 当读取expr时,中断程序。目前,此命令只支持硬件方式实现,因为值读取操作不改变值大小。awatch [-l|-location] expr [thread thread-id] [mask maskvalue] 当读写expr时,中断程序。目前,此命令只支持硬件方式实现。

condition

condition bnum expression 在断点bnum添加一个条件,expression为true时才停止程序运行。expression里是程序里的函数,命中断点时则可能会调用此函数,调用的函数可能会修改程序数据。condition bnum 移除bnum上的条件
最新回复(0)