断点维护

在gdb中,如果觉得设置的断点已经没有用处了,可以使用delete clair  disable|enable 对断点进行操作

clear         清除所有的已定义的停止点。

clear <function>,clear <filename:function>        清除所有设置在函数上的停止点。

clear <linenum>,clear <filename:linenum>        清除所有设置在指定行上的停止点。

delete [breakpoints] [range...]        删除指定的断点,breakpoints为断点号。如果不指定断点号,则表示删除所有的断点。range 表示断点号的范围(如:3-7)。其简写命令为d。

比删除更好的方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可.

disable [breakpoints] [range...]
disable所指定的停止点,breakpoints为停止点号。如果什么都不指定,表示disable所有的停止点。简写命令是dis.

enable [breakpoints] [range...]
enable所指定的停止点,breakpoints为停止点号。

enable [breakpoints] once range...
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动disable。

enable [breakpoints] delete range...
enable所指定的停止点一次,当程序停止后,该停止点马上被GDB自动删除。

条件断点维护

在前面一篇文章提到,可以使用b <function_name> if condition 来设置条件断点,当条件成立时,程序自动停止;

同时我们可以使用condition命令来修改条件(只有break和watch命令支持if,catch目前暂不支持if);

condition <bnum> <expression>         修改断点号为bnum的停止条件为expression。

condition <bnum>        清除断点号为bnum的停止条件。
还有一个比较特殊的维护命令ignore,你可以指定程序运行时,忽略停止条件几次。

ignore <bnum> <count>        表示忽略断点号为bnum的停止条件count次。

为停止点设置运行命令

我们可以使用gdb提供的command 来为停止点处设置运行命令,即当程序运行到断点处时,会自动运行先前使用command来设置的命令,这样很方便来进行自动化调试;

commands [bnum]
... command-list ...
end

为断点号bnum指写一个命令列表。当程序被该断点停住时,gdb会依次运行命令列表中的命令。
例如:

break foo if x>0
commands
printf "x is %d\n",x
continue
end

恢复程序运行和单步调试

当程序运行到断点处时,程序被挺住,这时可以使用continue命令使程序继续运行,next或者step命令进行单步跟踪

continue [ignore-count]
c [ignore-count]
fg [ignore-count]

恢复程序运行,直到程序结束,或是下一个断点到来。ignore-count表示忽略其后的断点次数

step

单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息,后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住

set step-mode,set step-mode on

打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码

next 

单步运行count 条指令,count默认值为1

finish

运行程序,直到当前函数完成返回。并打印函数返回时的堆栈地址和返回值及参数值等信息。

until

可以运行程序直到退出循环体

stepi 或 si,nexti 或 ni

单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令

来自yaronspace.cn  本文链接:http://yaronspace.cn/blog/archives/961