今天在公司的项目中的一个函数中,进行运行的时候,出现了一个怪异的段错误现象。
开始以为是哪个字串在进行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个字节。