服务器内存问题总结

       http://blog.csdn.net/wclin88/article/details/7277028

       最近服务器总是不定时的奔溃,从core文件的堆栈上看,是奔溃在lua的实现文件里面,都是分配内存或是释放内存时发生的。

查看目录/var/log下的messages文件,可以发现有这样的日志
 *** glibc detected ***   free(): invalid next size (normal 或fast): 0x00000000d15bd970 *** 或
double free or corruption (fasttop): 0x0000000000c0d010 ***;
从网上搜索到的信息,出现第一种信息的原因是错误释放内存(有可能是由于malloc()调用时的参数不对或是使用指针越界了);
第二种是重复释放了同一块内存(free两次同一个指针)。
下面的一个例子:
这里操作越界没为问题,但是free时就出现了invalid next size(fast)的信息;
int main(int argc,char **argv)
{
        char    *str;
        str = (char*)malloc(sizeof(char)*MAX_NUM);
        if(!str)
                exit(-1);

       for(int i=0;i<MAX_NUM+12333;i++)
      {
                str[i] = 'a';
      }
       free(str);
       printf("Done\n");
       return 0;
}

郁闷的是现在服务器代码量太大,一时还找不到是什么地方出错,而且lua代码又是另一个同事写的,只能先对现在能找到的操作堆内存的数组加上进行大小检测的代码。
另外,从网上资料可以查到,上面出现的两个错误日志信息是linux一个叫glibc 的工具打印出来的。
在默认的情况下,产生错误的程序也会被中止。但是,这(以及是否产生错误信息)可以通过环境变量 MALLOC_CHECK_ 来控制。以下的设置 是被支持的:
0 - 不产生错误信息,也不中止这个程序
1 - 产生错误信息,但是不中止这个程序
2 - 不产生错误信息,但是中止这个程序
3 - 产生错误信息,并中止这个程序
备注
如果 MALLOC_CHECK_ 被设置为除 0 以外的值,这会使 glibc 进行更多的检查并可能影响到系统 的性能。

所以我先把出现问题频繁的服务器的MALLOC_CHECK_ 先设置为1,作为一个缓兵之计。
(把export MALLOC_CHECK_=1 放到/etc/profile里,然后执行.  /etc/profile使其生效)

其他资料:http://blog.csdn.net/ixidof/article/details/5662621

精:http://blog.csdn.net/tommy_lgj/article/details/2790452


后:记得当时试过上面的“缓兵之计”,但是没有生效。最后找到的原因时一个写入越界的代码引起的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值