Chinaunix首页 | 论坛 | 博客
  • 博客访问: 451734
  • 博文数量: 96
  • 博客积分: 4130
  • 博客等级: 上校
  • 技术积分: 1149
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 12:32
文章分类

全部博文(96)

文章存档

2011年(19)

2010年(75)

2009年(1)

2008年(1)

我的朋友

分类:

2010-11-09 16:48:15

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

from:?p=1188

阅读(1135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~