0%

Linux debug 停下来环顾程序

调试器不仅能够运行程序,还可以通知它暂停程序的运行,暂停以后,调试器提供了检查变量、跟踪执行路径的机会。

暂停机制

有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每当某个表达式改变了值就暂停执行的指令。

处无为之事,行不言之教;作而弗始,生而弗有,为而弗恃,功成不居!

欢迎关注我的其它发布渠道