首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

截取 SIGSEGV 将不会发作 core dump 文件

2013-09-28 
截取 SIGSEGV 将不会产生 core dump 文件最近做了个实验验证 signal 和 core dump 的关系,用的是glibc1)

截取 SIGSEGV 将不会产生 core dump 文件

最近做了个实验验证 signal 和 core dump 的关系,用的是glibc

1) 不截取 SIGSEGV , 系统会产生 core dump 文件 (注意:不要忘了设置 ulimit -c unlimited)

2) 截取 SIGSEGV, 并调用 exit(), 就不会产生 core dump 文件 (如下面代码所示)

       不调用 exit(), 就会不停地调用 crashHandler,因为信号没有被处理

3) 在 crashHandler,最后不调用 exit(), 而是调用  signal(SIGSEGV, SIG_DFL);

    处理过程是这样: a: 打印 stack, 恢复 SIGSEGV 缺省处理, b, 第二次按系统缺省方式处理 SIGSEGV: 产生core dump 文件, 程序退出

4)SIG_IGN 无效,和 SIG_DFL一样都产生 core dump 文件

      就是说 signal(SIGSEGV, SIG_IGN); 等价   signal(SIGSEGV, SIG_DFL)


static void crashHandler(int sig){    signal(SIGSEGV, SIG_IGN);    size_t size;    char **strings;    size_t i, j;    void *array[10];    size = backtrace (array, 10);    strings = (char **)backtrace_symbols (array, size);    ALOGE( "!!!--- received signal: %s! Stack trace:\n",strsignal(sig));    for (i = 0; i < size; i++) {        ALOGE( "%d %s \n",i,strings[i]);    }    free (strings);    exit(128 + sig);}int main(int argc, char **argv){ signal(SIGSEGV, crashHandler); //to crash char *a ; a = 0; *a=1; ...} 



热点排行