linux中C程序运行时怪异的段错误--linux中因栈空间不足而出现的运行时段错误

今天在公司的项目中的一个函数中,进行运行的时候,出现了一个怪异的段错误现象。

 

开始以为是哪个字串在进行sprintf时类型不一致或是某个指针出现了问题,结果找了半天也没有发现有这方面的问题,又使用gdb进行跟踪,结果跟踪到段错误的地方,使用bt命令列出当前函数栈列表,发现出错的地儿是使用的另一个由别人开发的库文件中的一个函数,没法,没得源代码,在此种情况下,只有二种解决方法:

(1)寻找源代码,查看源代码;

(2)一点一点的注释掉接近段错误出现的函数周围的代码;

由于公司找代码比较麻烦,且此库的代码并不是一时半会能看得完全懂,故最后采取了第二种方案。

 

使用第二种方法注释后,还是存在这种问题,最后就试着把此函数中的一个800字节的char型数组给改成了200个字节(因为通过gdb调试看到只使用了190多字节)的,再一编译运行,居然就可以了,再改成400字节大小的,就又有段错误的出现,故猜测应该是一个程序的栈空间的大小有限制,最后又尝试了使用malloc在堆上进行800字节空间的分配,编译运行后也没有问题,最后就认定为是由于栈空间已经不足而造成的。

 

以下是我写的测试系统中的一个进程所支持的最大栈大小的程序:

/************************************
 * author     :Samson.wen
 * create date:2011-02-14

 * info       :测试linux程序的栈的最大字节值
 * **********************************/

#include <stdio.h>

int testtack(int num)
{
    int buff[num];
    printf("num is %d/n", num);
    return 0;   
}
int main(int argc, char* argv[])
{   

    int buflen = 2 * 1024 * 1024;
    for(; buflen < 8 * 1024 * 1024; buflen++)
        testtack(buflen);
    printf("hello, world");
    return 0;
}

 

我本本运行结果如下:

.........省去N条打印
num is 3143036
num is 3143037
num is 3143038
num is 3143039
num is 3143040
段错误

当出现段错误前的时候所显示的值就是当前进程所支持的最大栈大小,此处为3143040个int值,即为3143040 * 4个字节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值