现在的位置: 首页 > 综合 > 正文

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

2017年10月08日 ⁄ 综合 ⁄ 共 749字 ⁄ 字号 评论关闭

转载至:http://www.wuzesheng.com/?p=1188

相信用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号信号的:

抱歉!评论已关闭.