首页 > 程序人生 > C/C++程序在GDB调试状态时的信号响应

C/C++程序在GDB调试状态时的信号响应

相信用GDB调试过程序的朋友都知道,C/C++程序在GDB调试状态是不能直接响应外部信号的。比如,你正在用GDB运行一个程序,然后,你按了Ctrl+C,GDB收到SIGINT信号,程序本身并不会收到这个信号。那么,倒底如何让GDB把信号传递给应用程序本身呢?且听我一一道来。

GDB中有一个handle命令,可以指定如何处理收到信号,GDB支持的对信号的处理主要有以下几种:
(1)stop和nostop: nostop表示当GDB收到指定的信号,不会应用停止程序的执行,只会打印出一条收到信号的消息,因此,nostop也暗含了下面的print; 而stop则表示,当GDB收到指定的信号,停止应用程序的执行。
(2)print和noprint: print表示如果收到指定的信号,打印出一条信息; noprint与print表示相反的意思
(3)pass和nopass:pass表示如果收到指定的信号,把该信号通知给应用程序; nopass表示与pass相反的意思
(4)ignore和noignore: ignore与nopass同义,同理,noignore与pass同义

GDB中handle命令的具体用法为:handel signal action
(1)signal:可以为数字1-15,也可以为符号类型的,比如:SIGSEGV, SIGINT。
(2)action: 为上面介绍的stop/nostop, print/noprint, pass/nopass和ignore/noignore中的其中一种。
(3)在gdb中,用info signals或者info handle,可以查看哪些信号被GDB处理,并且可以看到缺省的处理方式,下图是1-15号信号的:

分类: 程序人生 标签: , , , ,
  1. 2010年6月9日09:10 | #1

    太专业了,我看不懂~支持一下吧

  2. 2010年6月9日09:12 | #2

    @老实人博客 呵呵~~ 感谢支持~~

  3. LEON
    2010年6月9日10:21 | #3

    我前天刚试了这个,但是总是ctrl+c直接把我的程序给干掉了……好像是因为程序里做了ctrl+c的信号处理的缘故。

  4. Leon
    2010年6月9日11:15 | #4

    把程序里的SIGINT的处理注释掉就好了。。。
    我觉得很奇怪,gdb的设置已经表示不传这个信号给程序了,为什么还是会被程序截获。。你遇到过没?

    顺带问个问题,怎么再gdb的命令行里面保存debug的那些调试点?

  5. 2010年6月9日12:31 | #5

    @LEON 缺省情况SIGINT是gdb自己截获的。。不会传给应用程序的。。

  6. 2010年6月9日12:34 | #6

    @Leon 在你的目录下加一个.gdbhistory文件,再加一个.gdbinit文件。
    在.gdbinit中写入:
    ~/.gdbhistory
    set history file ~/.gdbhistory
    set history save

    然后你执行过的gdb命令就会被保存下来~~ 可以通过上下键来找以前的命令了。不知道这样能不能解决你的问题。

  7. Leon
    2010年6月9日15:26 | #7

    @小武哥
    对的,很奇怪,我看了info handle了,也是截获的。。

  8. 2010年6月10日08:59 | #8

    @Leon 是不是理解上的偏差。。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
您必须在 登录 后才能发布评论.