Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36521
  • 博文数量: 7
  • 博客积分: 156
  • 博客等级: 入伍新兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-20 20:16
文章分类

全部博文(7)

文章存档

2011年(7)

分类: LINUX

2011-06-02 12:49:53

 某次编写一个很简单的程序时出现了奇怪的Segmentation fault,例子如下:

     1 #include 
     2 #include 
     3 #include 
     4 
     5 int main(void) {
     6     char buf[16 * 1024 * 1024]; // 16M
     7 
     8     memset(buf, 0sizeof(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的限制是程序异常的罪魁祸首。
阅读(2639) | 评论(2) | 转发(1) |
给主人留下些什么吧!~~

tekkamanninja2012-02-09 09:44:18

恩,受教了~~谢谢
以前只是用ulimit调整core文件的限制,没有仔细研究过。

txgc_wm2012-02-09 09:20:37

不错,很有意义!