LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1858|回复: 3

关于SIGSEGV信号的捕获

[复制链接]
发表于 2006-11-27 01:00:09 | 显示全部楼层 |阅读模式

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>

  4. char *g_pCH = NULL;
  5. char *g_pOther = NULL;
  6. void processSIGSEGV(int sig)
  7. {
  8.     if(SIGSEGV != sig)
  9.         {
  10.         return;
  11.         }
  12.     g_pOther = g_pCH;
  13.     sigset(SIGSEGV,processSIGSEGV);
  14. }
  15. int main()
  16. {
  17.     sigset(SIGSEGV,processSIGSEGV);
  18.     char *g_pOther= (char *)malloc(1024);
  19.     printf("g_pOther is 0x%x.\n",g_pOther);
  20.     g_pCH = g_pOther;
  21.     g_pOther= (char *)0x33345;
  22.     printf("g_pOther is 0x%x.\n",g_pOther);
  23.     free(g_pOther);
  24.     printf("memory freeed\n");
  25.     return 0;
  26. }

复制代码


现在有一个棘手的进程core dump问题,已经知道是有段错误,也知道是哪一个指针引起的.
但是不知道指针在哪里被修改了,因此想写个小程序看能否捕获SIGSEGV信号,然后在信号处理函数中将错误指针重置,但是现在信号捕获后进程不退出,用gdb调试发现,free语句一直在执行,然后一直收到SIGSEGV段错误,陷入死循环.

请大侠看看,为什么信号处理函数中已经生效,但是还有SIGSEGV出现?
发表于 2006-11-27 03:22:39 | 显示全部楼层
sigset 你好像是用錯了吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-27 21:34:05 | 显示全部楼层
没有错吧...

今天终于在SIGSEGV中使用long jump跳转摆脱了信号处理死循环.
回复 支持 反对

使用道具 举报

发表于 2006-11-28 09:40:21 | 显示全部楼层
long jump是什么操作,是用goto语句吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表