服務器內存問題總結

最近服務器總是不定時的奔潰,從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


後:記得當時試過上面的“緩兵之計”,但是沒有生效。最後找到的原因時一個寫入越界的代碼引起的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章