记录学习过程中的点点滴滴
gdb调试程序系统之断点设置【二】
调试程序时,暂停程序运行时首要任务,在gdb中有以下几种暂停方法:断点(BreakPoint)、观察点(WatchPoint)、捕捉点(CatchPoint)、信号(Signals)、线程停止(Thread Stops)
设置断点
break <function> | 在进入指定函数时停住。C++中可以使用class::function或function(type,type)格式来指定函数名 |
break <linenum> | 在指定行号停住 |
break +offset
break -offset |
在当前行号的前面或后面的offset行停住。offset为自然数 |
break filename:linenum | 在源文件filename的linenum行处停住 |
break filename:function | 在源文件filename的function函数的入口处停住 |
break *address | 在程序运行的内存地址处停住 |
break | break命令没有参数时,表示在下一条指令处停住 |
break … if <condition> | …可以是上述的参数,condition表示条件,在条件成立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序 |
info breakpoints [n]
info break [n] |
查看断点时,可使用info命令,如下所示:(注:n表示断点号) |
设置观察点
观察点一般来观察某个表达式(变量也是一种表达式)的值是否有变化了,如果有变化,马上停住程序。我们有下面的几种方法来设置观察点:
watch <expr> 为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch <expr> 当表达式(变量)expr被读时,停住程序。
awatch <expr> 当表达式(变量)的值被读或被写时,停住程序。
info watchpoints 列出当前所设置了的所有观察点。
设置捕捉点
catch <event> 和tcatch <event> ,用help catch和help tcatch来看具体用法
信号(Signal)
信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。
GDB有能力在你调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB的handle命令来完成这一功能。
handle <signal> <keywords…>
在GDB中定义一个信号处理。信号<signal>可以以SIG开头或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其<keywords>可以是以下几种关键字的一个或多个。
Nostop 当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。
stop 当被调试的程序收到信号时,GDB会停住你的程序。
print 当被调试的程序收到信号时,GDB会显示出一条信息。
noprint 当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
pass,noignore 当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
nopass,ignore 当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
info signals,info handle 查看有哪些信号在被GDB检测中。
线程(Thread Stop)
如果程序是多线程的话,你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。
break <linespec> thread <threadno>
break <linespec> thread <threadno> if …
linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过“info threads”命令来查看正在运行程序中的线程信息。如果你不指定thread <threadno>则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如:
(gdb) break frik.c:13 thread 28 if bartab > lim
当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。
来自yaronspace.cn 本文链接:http://yaronspace.cn/blog/archives/946您可能对下面文章也感兴趣:
这篇文章由admin于2010 年 11 月 10 日 11:46发表在Linux编程, 编程语言与算法设计。你可以订阅RSS 2.0 你可以跳到结尾直接评论。目前不允许通知。 |