某次编写一个很简单的程序时出现了奇怪的Segmentation fault,例子如下:
1 #include
2 #include
3 #include
4
5 int main(void) {
6 char buf[16 * 1024 * 1024]; // 16M
7
8 memset(buf, 0, sizeof(buf));
9 strcpy(buf, "Hello!");
10 printf("%s\n", buf);
11
12 return EXIT_SUCCESS;
13 }
14
这么简单的程序,反复检查几遍也没有发现有什么异常之处,于是祭出gdb,结果如下:
Program terminated with signal 11, Segmentation fault.
#0 main () at arr.c:8
8 memset(buf, 0, sizeof(buf));
(gdb) backtrace
#0 main () at arr.c:8
(gdb)
也就是说memset出现了错误,仔细查对参数后认定,memset的用法是对的。。。
没办法,接着尝试将buf改小到4M,程序正常输出。。。
那就一定是buf的大小存在问题,于是想起APUE上说过栈空间大小是有限的,可能会使用完,难道是这个问题?于是乎逐个查看系统限制参数,发现ulimit里有:
stack size (kbytes, -s) 8192
经过一番测试后,最终确认stack size的限制是程序异常的罪魁祸首。
阅读(2644) | 评论(2) | 转发(1) |