近日,程序总是莫名其妙的coredump,而且还是在变量定义的时候(如 int a=1),百思不得其解。在这种情况下,只有几种情况可能出现:内存踩踏、栈溢出。
在经过长时间的分析确认,肯定不是内存踩踏。剩下的就是栈溢出了。Linux下一般单个程序栈大小为10M,可用ulimit -s查阅。一般情况下,10M的大小足够用,怎会出现栈溢出。再次对代码进行了详细的分析,发现有一处临时变量的结构竟然有2M之巨。此处确实难以理解,为何采用如此大的结构体。可能是考虑到动态分配内存用不好容易导致内存泄漏,因此采用临时变量。另外该函数又被递归调用两次,因此该函数就耗用接近5M的栈空间。将该结构体改为指针后,该问题即解决。
解决该问题后,过了一段时间又出现了该问题,耗费较长时间后,最终确定又是栈溢出导致的。
查阅一番资料发现有一库可以检测栈溢出问题,现分享给大家,它就是libsigsegv。使用方法如下:
1.下载libsigsegv库,编译并安装。
1 2 3 4 5
| tar -xvzf libsigsegv-2.11.tar.gz cd libsigsegv-2.11 ./configure make make install
|
2.将库集成到程序中。
a.在主程序添加如下
1 2 3 4 5 6 7 8 9 10 11 12 13
| //加载头文件 #include "sigsegv.h"
#ifndef SIGSTKSZ # define SIGSTKSZ 1116384 #endif
//栈溢出后处理函数 void stackoverflow_handler (int emergency, stackoverflow_context_t scp) { printf ("Stack overflow caught."); exit(0); }
|
b.在main函数中添加
1 2
| char mystack[SIGSTKSZ]; stackoverflow_install_handler (&stackoverflow_handler,mystack, sizeof (mystack));
|
注意:SIGSTKSZ为程序栈大小,请根据实际情况修改。
3.编译链接库,加上-lsigsegv。
当出现栈溢出时,将调用栈溢出函数,并退出程序,。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| //stack_overflow.c #include <stdio.h> #include <stdlib.h> #include "sigsegv.h"
int times=0; void stack_test() { long long int a[10000][1000]; while(1) { printf("times=%d\n",times++); stack_test(); } } void stackoverflow_handler (int emergency, stackoverflow_context_t scp) { printf ("Stack overflow caught."); exit(0); } #ifndef SIGSTKSZ # define SIGSTKSZ 1116384 #endif
int main() { char mystack[SIGSTKSZ]; stackoverflow_install_handler (&stackoverflow_handler,mystack, sizeof (mystack)); stack_test(); return 0; }
#if 0 编译: gcc -o stack -g -O2 stack_overflow2.c -lsigsegv #endif
|
执行./stack一段时间后,出现
1 2 3 4 5 6 7 8 9 10 11
| ... times=392729 times=392730 times=392731 times=392732 times=392733 times=392734 times=392735 times=392736 times=392737 Stack overflow caught.
|