栈溢出问题分析

栈溢出问题分析

近日,程序总是莫名其妙的coredump,而且还是在变量定义的时候(如 int a=1),百思不得其解。在这种情况下,只有几种情况可能出现:内存踩踏、栈溢出。

在经过长时间的分析确认,肯定不是内存踩踏。剩下的就是栈溢出了。Linux下一般单个程序栈大小为10M,可用ulimit -s查阅。一般情况下,10M的大小足够用,怎会出现栈溢出。再次对代码进行了详细的分析,发现有一处临时变量的结构竟然有2M之巨。此处确实难以理解,为何采用如此大的结构体。可能是考虑到动态分配内存用不好容易导致内存泄漏,因此采用临时变量。另外该函数又被递归调用两次,因此该函数就耗用接近5M的栈空间。将该结构体改为指针后,该问题即解决。

解决该问题后,过了一段时间又出现了该问题,耗费较长时间后,最终确定又是栈溢出导致的。

查阅一番资料发现有一库可以检测栈溢出问题,现分享给大家,它就是libsigsegv。使用方法如下:

1.下载libsigsegv库,编译并安装。

tar -xvzf  libsigsegv-2.11.tar.gz
cd libsigsegv-2.11
./configure
make
make install

2.将库集成到程序中。

a.在主程序添加如下

//加载头文件
#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函数中添加

char mystack[SIGSTKSZ];
stackoverflow_install_handler (&stackoverflow_handler,mystack, sizeof (mystack));

注意:SIGSTKSZ为程序栈大小,请根据实际情况修改。

3.编译链接库,加上-lsigsegv。

当出现栈溢出时,将调用栈溢出函数,并退出程序,。

示例:

//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一段时间后,出现

...
times=392729
times=392730
times=392731
times=392732
times=392733
times=392734
times=392735
times=392736
times=392737
Stack overflow caught.

Juyin@2018/1/16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值