日期:2014-05-16  浏览次数:20737 次

GDB信号的处理和启动配置文件(转载)
信号的处理
程序是和网络相关的,调试期间经常地收到SIGPIPE,导致gdb停下来。看了一下gdb info,解决方法很简单。用handle命令设置一下缺省signal的处理行为就可以了:
handle SIGPIPE nostop
如果连提示信息都不想看见,就可以这样设置:
handle SIGPIPE nostop noprint
就可以了。其他相关信号也可以类似处理。想了解目前的signal状态可以使用info signal察看。

启动配置文件
GDB使用中比较麻烦的事情,就是每次启动,还要手动敲一把命令,特别是断点比较多的情况,这个特便影响,工作效率。查了一下 gdb info,gdb支持自动读取一个启动脚本文件.gdbinit,所以经常输入的启动命令,就都可以写在gdb启动目录的.gdbinit里面。比如
.gdbinit:
file myapp
handle SIGPIPE nostop
break ss.c:100
break ss.c:200
run
GDB和bash类似,也支持source这个命令,执行另外一个脚本文件。所以可以修改一下.gdbinit:
.gdbinit:
file myapp
handle SIGPIPE nostop
source gdb.break
run
gdb.break:
break ss.c:100
break ss.c:200
这样修改的断点配置,只需要编辑gdb.break就可以了。再后来,偶而还是需要单独启动GDB,不想执行自动脚本,于是又改进了一下。首先把.gdbinit命名为gdb.init,然后定义一个shell alias:
$ alias .gdb=”gdb -x gdb.init”
这样如果需要使用自动脚本,就用.gdb命令,否则用gdb进入交互状态的gdb。这样配置以后可以一个简单命令就开始调试,整个效率就能提高不少。

信号(Signals)
信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程式一般都会处理信号。UNIX定义了许
多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改动信号;
SIGKILL表示终止程式运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。
GDB有能力在你调试程式的时候处理所有一种信号,你能告诉GDB需要处理哪一种信号。你能需求GDB收到你所指定的信号时,马上停住正在运行的程式,以供你进行调试。你能用GDB的handle命令来完成这一功能。
handle
在GDB中定义一个信号处理。信号能以SIG开头或不以
SIG开头,能用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,
SIGIOT,SIGKILL三个信号),也能使用关键字all来标明要处理所有的信号。一旦被调试的程式接收到信号,运行程式马上会被GDB停住,以
供调试。其能是以下几种关键字的一个或多个。
nostop
当被调试的程式收到信号时,GDB不会停住程式的运行,但会打出消息告诉你收到这种信号。
stop
当被调试的程式收到信号时,GDB会停住你的程式。
print
当被调试的程式收到信号时,GDB会显示出一条信息。
noprint
当被调试的程式收到信号时,GDB不会告诉你收到信号的信息。
pass
noignore
当被调试的程式收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程式会处理。
nopass
ignore
当被调试的程式收到信号时,GDB不会让被调试程式来处理这个信号。
info signals
info handle
查看有哪些信号在被GDB检测中。