首页 > 代码库 > gdb学习-checkpoint,watch

gdb学习-checkpoint,watch

checkpoint的内容参考:

http://blog.chinaunix.net/uid-23629988-id-2943273.html

这一篇主要是checkpoint,在next之前加checkpoint命令,然后就可以用 restart 1 来恢复到之前的checkpoint,可以避免从头再来。

 

用 info checkpoints 可以看到所有的checkpoints。

好像也能看到breakpoint的

(gdb) info checkpoints
* 1 process 2060 at 0x80483e7, file test.c, line 33
  0 process 2059 (main process) at 0x80483f7, file test.c, line 35

 

watch看

http://simohayha.iteye.com/blog/493091

 

watch是监测变量改变。watch expr [thread threadno] 是只针对这个线程对变量的改变。

rwatch是针对变量被读; awatch是针对变量被改变或者被读。

 

break是断点

tbreak是一次性的断点。

 

break location if condition 是condition为真的时候,到达这个location才会生效。

 

rbreak是带有regex的断点。

 

catch event是当事件发生的时候,会生效,

这些事件包括了:throw, catch, exception, exception unhandled, assert, exec, fork, vfork等。

tcatch指一次性的catch.

 

一个断点(包括 watchpoint和catchpoint)可以有下面四种状态. :

打开,关闭,enabled once,enabled for deletion 

分别对应下面的:

disable [breakpoints][range..]  关闭指定的断点或者全部断点(如果没有range) 

enable [breakpoints][range..] 打开指定的断点或者全部断点(如果没有range) 

enable [breakpoints] once range  临时打开指定的断点(也就是说是一次性的,. 

enable [breakpoints] delete range 临时打开指定的断点并只工作一次,也就是一次之后这个断点将会被删除. 

 

clear删除断点,

clear location, 最常用的是:

clear function, clear file:function, clear linenum, clear file:linenum.

 

clear与delete的区别,clear是给出行号或者函数,而delete是给出断点编号。

 

condition除了跟在break后面,也是可以单独作为命令使用的:break condition 

contidition bnum expression  当expression为真的时候,程序到达这个断点才会停止. 

contidition bnum 从断点bnum删除掉一个condition. 

ignore bnum count 设置一个断点bnum的忽略次数为count.也就是只有count次数后,这个断点才会起作用. 

 

break里面还可以带上一串命令

break 403
commands
///不输出任何东西
silent
///改变x的值
set x = y + 4
///然后continue
cont
end

用commands + end 来实现

 

step [count] 

加count,是step多次,如果遇到断点会停止。

 

next [count] 
和step很类似,区别就是不会跟进函数。 

 

step的行为通过step-mode来控制:

  1. set step-mode  
  2. set step-mode on  
  3. set step-mode off  

on就可以使step停止在没有debug信息的函数的第一条指令上。off则是直接执行完这个函数。 

这里要注意上面的命令都只是跳一行代码。而不是一条指令。 

stepi是执行指令。nexti也是。

 

gdb可以监测在你的程序中的任何信号。 

 

gdb学习-checkpoint,watch