免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4982 | 回复: 12
打印 上一主题 下一主题

[C] 如何捕捉栈溢出产生的信号 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-06 10:27 |只看该作者 |倒序浏览
本帖最后由 contestjia 于 2015-08-06 10:27 编辑
  1. #include <stdio.h>
  2. #include <signal.h>

  3. static int count=0;

  4. void handler(int signo)
  5. {
  6.     printf("count=%d\n", count);
  7. }

  8. void test_stack(void)
  9. {
  10.     char data[1<<20];
  11.     count++;
  12.     test_stack();
  13. }

  14. int main()
  15. {
  16.     signal(SIGSEGV, &handler);
  17.     test_stack();
  18. }
复制代码
执行程序,捕捉不到这个信号~~~~

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2015-08-06 10:53 |只看该作者
本帖最后由 hanxin83 于 2015-08-06 11:04 编辑

答案删了, 发现自己也没有弄清楚, 去研究一下再回来~~~~

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
3 [报告]
发表于 2015-08-06 12:27 |只看该作者
先说一句题外话:The  only portable use of signal() is to set a signal's disposition to SIG_DFL or SIG_IGN.  The semantics when using signal() to establish a signal handler vary across systems (and POSIX.1 explicitly permits this variation); do not use it for this purpose.
这句题外话是从 signal 的 man page 中摘抄的,意思是除外你是把 signal 的 handler 设成 SIG_DFL 或者 SIG_IGN,否则最好不要用 signal,而应该用 sigaction。

言归正传,为什么你的程序捕捉不到 SIGSEV 呢?那是因为要捕捉这个信号你的信号处理函数也是要运行的,而你的 SIGSEV 是由于栈溢出产生的,而信号处理函数默认也是在默认栈上运行的,栈溢出了它也一样运行不了。所以解决方案是让信号处理函数不在默认栈上运行,这正好也说明了我们不该用 signal,而应该用 sigaction,因为只有 sigaction 才可以指定 flag,具体例子(在你的例子基础上修改的)如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>

  4. static int count=0;

  5. void handler(int signo)
  6. {
  7.     printf("count=%d\n", count);
  8. }

  9. void test_stack(void)
  10. {
  11.     char data[1<<20];
  12.     count++;
  13.     test_stack();
  14. }

  15. int main ( void )
  16.   { stack_t ss = { . ss_size = SIGSTKSZ }
  17.   ; if ( ( ss . ss_sp = malloc ( SIGSTKSZ ) ) == NULL )
  18.       { perror ( "malloc" )
  19.       ; exit   ( EXIT_FAILURE )
  20.       ; }

  21.     if ( sigaltstack ( &ss , NULL ) == -1 )
  22.       { perror ( "sigaltstack" )
  23.       ; exit   ( EXIT_FAILURE )
  24.       ; }

  25.     struct sigaction act = { . sa_handler = handler , . sa_flags = SA_ONSTACK } ;
  26.     sigemptyset ( & ( act . sa_mask ) ) ;
  27.     if ( sigaction ( SIGSEGV , & act , NULL ) == -1 )
  28.         perror ( "sigaction" ) ;

  29.     test_stack();
  30. }
复制代码

评分

参与人数 2可用积分 +10 信誉积分 +10 收起 理由
windoze + 10 很给力!
MMMIX + 10 赞一个!

查看全部评分

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2015-08-06 12:43 |只看该作者
回复 3# Monox


    把语句结束符 ; 放在下一语句之前,这代码风格实在诡异……

论坛徽章:
7
巳蛇
日期:2014-04-10 08:54:57白羊座
日期:2014-04-22 20:06:262015年亚洲杯之沙特阿拉伯
日期:2015-02-10 14:18:532015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之吉达阿赫利
日期:2015-06-02 11:34:112015亚冠之武里南联
日期:2015-06-24 12:13:082015亚冠之阿尔纳斯尔
日期:2015-08-03 09:08:25
5 [报告]
发表于 2015-08-06 12:51 |只看该作者
回复 4# MMMIX


    这是我这几天自创的代码风格,; 放在后面个人觉得比较难看。之前;和}还在不同行,而且即使只有一条语句的时候;也会另起一行的,后来觉得太浪费空间了后来就改到同一行了。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2015-08-06 13:08 |只看该作者
Monox 发表于 2015-08-06 12:27
先说一句题外话:The  only portable use of signal() is to set a signal's disposition to SIG_DFL or SI ...



这都是什么跟什么

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2015-08-06 13:24 |只看该作者
回复 6# zylthinking
好吧 我看漏了


   

论坛徽章:
14
水瓶座
日期:2014-06-10 09:51:0215-16赛季CBA联赛之江苏
日期:2017-11-27 11:42:3515-16赛季CBA联赛之八一
日期:2017-04-12 14:26:2815-16赛季CBA联赛之吉林
日期:2016-08-20 10:43:1215-16赛季CBA联赛之广夏
日期:2016-06-23 09:53:58程序设计版块每日发帖之星
日期:2016-02-11 06:20:00程序设计版块每日发帖之星
日期:2016-02-09 06:20:0015-16赛季CBA联赛之上海
日期:2015-12-25 16:40:3515-16赛季CBA联赛之广夏
日期:2015-12-22 09:39:36程序设计版块每日发帖之星
日期:2015-08-24 06:20:002015亚冠之德黑兰石油
日期:2015-08-07 09:57:302015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2015-08-06 14:30 |只看该作者
回复 3# Monox


    这个有点牛逼了

论坛徽章:
0
9 [报告]
发表于 2015-08-06 14:35 |只看该作者
回复 3# Monox
谢谢你,知道为什么这个信号捕捉不到了~~

   

论坛徽章:
0
10 [报告]
发表于 2015-08-06 14:38 |只看该作者
回复 3# Monox
sigalstack这个函数是不是把当前栈修改到了堆上(malloc分配)?那我用这个程序测试栈大小,是测试的修改后的堆大小,还是原本的栈大小?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP