atchpoint)我们可以设置捕捉点来捕捉程序运行时的一些事件。
如:载入共享库(动态链接库)或是C的一场,设置捕捉点的格式为:catch当event 发生时,停住程序。
Event 可以是下面的内容:1、throw 一个C抛出的异常(throw 为关键字),2、catch 一个C捕捉到的异常(catch 为关键字),3、exec 调用系统调用exec 时( exec 为关键字,目前此功能只在HP-UX 下有用)4、fork 调用系统调用fork 时。
( fork 为关键字,目前此功能只在HP-UX 下有用)5、vfork 调用系统调用vfork 时。
( vfork 为关键字,目前此功能只在HP-UX 下有用)6、load 或load 载入共享库(动态链接库)时。
(load 为关键字,目前此功能只在HP-UX 下有用)7、unload 或unload 卸载共享库(动态链接库)时。
(unload 为关键字,目前此功能只在HP-UX 下有用)tcatch只设置一次捕捉,当程序停住后,断点被自动删除。
■ 维护停止点你可以使用delete、clear、disable、enable 这几个命令来进程维护。
clear清楚所有已定义的停止点。
clearclear清楚所有设置在函数上的停止点。
clearclear清楚所有设定在指定行上的停止。
delete breakpointsrange…删除指定的断点,breakpoints 为断点号。
如果不指定断点号,则表示删除所有的断点。
range 表示断点号的范围(如2-7),其简写命令为d。
比删除更好的一种方法是disable 停止点,disable 了的停止点,GDB 不会删除,当你还需要时,enable 即可,就好像回收站一样。
enablebreakpointsrange…enable 所指定的停止点,breakpoints 为停止号。
enablebreakpoints once rangeenable 所指定的停止点一次,当程序停止后,该停止点马上被GDB 自动disable。
enablebreakpoints delete rangeenable 所指定的停止点一次,当程序停止后,该停止点马上被GDB 自动删除。
■ 停止条件维护前面在说到设置断点时,我们提到过可设置一个条件,当条件成立时,程序自动停止,这是一个非常强大的功能,这里,专门说说这个条件相关维护命令。
一般来说,为断点设置一个条件,我们使用if 关键字,后面跟其断点条件。
并且条件设置好后,我们可以用condition 命令来修改断点的条件(只有break 和watch 命令支持if,catch 目前暂不支持if)condition修改断点号为bnum 的停止条件为expressioncondition清除断点号为bnum 的停止条件。
还有一个比较特殊的维护命令ignore,可以指定程序运行时,忽略停止条件几次。
ignore表示忽略断点号为bnum 的停止条件count 次。
■ 为停止点设定运行命令我们可以使用GDB 提供的command 命令来设置停止点的运行命令。
也就是说,当运行的程序在被停止住时,我们可以让你自动运行一些别的命令,这很有利于自动化调试。
对给予GDB 的自动化调试是一个很强大的支持。
commandbnum…command –list…end为断点号bnum 指定一个命令列表。
当程序被该断点停住时,gdb 会依次运行命令列表中的命令。
例如:break foo if x0commandsprintf “x is dn”x■ 断点菜单在C中,可能会出现同一个名字的函数若干次(函数重载),在这种情况下,break 不能告诉GDB 要停在哪个函数的入口。
当然, 你也可以使用break也就是把函数的参数类型告诉GDB,以指定一个函数。
否则的话,GDB 会给你列出一个断点菜单供你选择你所需要的断点。
你■ 恢复程序运行和单步调试当程序被停住后,你可以用continue 命令恢复程序的运行直到程序结束,或下一个断点的到来。
也可以使用step 或next 命令单步跟踪程序。
step单步跟踪,如果有函数调用,他会进入该函数。
进入函数的前提是,次函数被编译有debug 信息。
像VC 等工具中的step in。
后面可以加count,也可以不加,不加表示一条一条地执行,加表示执行后面的count 条指令,然后再停住。
next同样单步跟踪,如果有函数调用,他不会进入函数。
想VC 等工具中的stepover。
后面可以加count,也可以不加。
不加表示一条条的执行,加表示执行后面的count 指令,然后再停住。
set step-modeset step-mode on打开step-mode 模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。
这个参数很有利于查看机器码。
set step-mode off运行程序,直到当前函数完成返回。
并打印函数返回时的堆栈地址和返回值及参数值信息。
finish运行程序,直到当前函数完成返回。
并打印函数返回时的堆栈地址和返回值及参数值信心。
until 或u当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序知道退出循环体。
stepi 或sinexti 或ni单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi 和nexti 可以单步执行机器指令。
与之一样有相同功能的命令式“display/I pc”,当运行完这个命令后,单步跟踪会在打出代码的同时打出机器指令(也就是汇编代码)■ 线程(threadstops如果你的程序时多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。
GDB 很容易帮你完成这一工作。
breakthreadbreakthreadif…linespec 指定了断点是这在源程序的行号。
Threadno 指定了线程ID,注意,这个ID 是GDB 分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。
如果你不指定thread则表示你的断点设在所有的线程上面。
还可以为某个线程指定断点条件,如:gdbbreadk frik.c:13 thread 28 if bartablim■ 查看栈信息一个函数,函数的地址,函数的参数,函数内的局部变量都会被压入“栈(stack)”中。
你可以使用GDB 命令来查看当前的栈中的信息。
下面是一些查看函数调用栈信息的GDB 命令:backtracebt打印当前的函数调用栈的所有信息。
如:gdbbt0 func n250 at tst.c:61 0x08048524 in main argc1 argv0xbffff674 at tst.c:302 0x400409ed in __libc_start_main from /lib/libc.so.6从上可以看出函数的调用栈信息:__libc_start_main -- main -- funcbacktracebtn 是一个正整数,表示只打印栈顶上n 层的栈信息。
backtracebt-n 是一个负整数,表示只打印栈底下n 层的栈信息。
如果你要查看某一层的信息,你需要切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前的栈,如果你要查看栈下面层的详细信息,首先要做的是切换当前栈。
framefn 是一个从0 开始的整数,是栈中的层编号。
比如:frame 0,表示栈顶,frame ,表示栈的第二层。
up表示向栈的上面移动n 层,可以不打n,表示向上移动一层。
■ 查看源代码GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g 参数,把源程序信息编译到执行文件中。
不然就看不到源程序了。
当程序停下来以后,GDB 会报告程序停在了那个文件的第几行上,你可以用list 命令来打印程序的源代码。
还是来看一看查看源代码的GDB 命令吧。
list显示程序第linenum 行周围的源程序。
list显示函数名为function 的函数的源程序。
list显示当前行后面的源程序。
list -显示当前行前面的源程序。
list 命令还有下面的用法:list显示从first 行道last 行之间的源代码。
list.显示从当前行道last 行之间的源代码。
list 往后显示源代码。
一般来说在list 后面可以跟以下这些的参数:行号。
当前行号的正偏移量。
当前行号的负偏移量。
那个文件的那一行。
函数名那个文件中的那个函数。
程序运行时的语句在内存中的地址。
■ 1■ 1■ 1■ 工作目录
上一篇:
图像的显示保存处理
下一篇:
台湾海峡台风浪的数值模拟