调试器不仅能够运行程序,还可以通知它暂停程序的运行,暂停以后,调试器提供了检查变量、跟踪执行路径的机会。
暂停机制
有3中方式可以通过GDB暂停程序的执行:
- 断点:通知GDB在程序中的特定位置暂停执行;
- 监视点:通知GDB当特定内存位置(或者设计一个或多个位置的表达式)的值发生变化时暂停执行;
- 捕获点:通知GDB当特定事件发生时暂停执行;
在GDB中删除断点
- delete breakpoint_list
- delete
- clear
- clear function、clear filename:function、clear line_number、clear filename:line_number
在GDB中禁用断点
在调试会话期间,会遇到大量断点,对于经常重复的循环结构或函数,这种情况使得调试极不方便。如果要保留断点以便以后使用,暂时又不希望GDB停止执行,可以禁用它们,在以后需要时再启用。此时我们可以使用disable/enable breakpoint_list来禁用和启用断点。
DDD
可以直接拖拽断点,很方便;
还有一个优秀的功能Undo/Redo;
GDB中恢复执行的方法
- 使用step和next单步调试程序;
- 使用continue使GDB无条件地恢复程序的执行,知道它遇到另一个断点或者程序结束;
- 用finish或until命令恢复。
next和step的区别
next执行函数,不会在其中暂停,然后在调用之后的第一条语句处暂停;
step在函数中的第一个语句处暂停;
使用continue恢复程序执行
continue与执行一行代码的step和next相反,这个命令使GDB恢复程序的执行,直到触发断点或者程序结束。
continue命令可以接受一个可选的整数参数n,这个数字要求GDB忽略下面n个断点。
使用finish恢复程序执行
命令finish指示GDB恢复执行,直到恰好在当前栈帧完成之后位置,这意味着如果你在一个不是main的函数中,finish命令会导致GDB恢复执行,直到恰好在函数返回之后为止,例如:
如果在一个递归函数中,finish只会将你带到递归的上一层,这是因为每次调用都被看做在它自己权限内的函数调用,因为每个函数都有自己的栈帧,如果要在递归层次较高时完全退出递归函数,那么更适合使用临时断点及continue,或者使用until命令。
使用until恢复程序执行
命令until执行程序,直到到达当前循环体外的下一行源代码。
设置条件断点的方法
break break-args if (condition)
监视点
监视点是一种特殊类型的断点,它类似于正常断点,是要求GDB暂停程序执行的指令。区别在于监视点是没有“住在”某一行源码中,取而代之的是,监视点是指示GDB每当某个表达式改变了值就暂停执行的指令。