2012-05-01 56 views
1

我有一塊C代碼如下這在釋放calloc(崩潰)下面撥打:釋放calloc調用失敗並且代碼崩潰

... some code 
free (ipl->fldptr); 
ipl->fldptr = calloc (flds*4, sizeof(struct fldptr_type)); 
...some more code 

我試圖入庫它,我得到下面回溯在墜毀:

Program received signal SIGSEGV, Segmentation fault. 
0x0000003ade478f94 in _int_malloc() from /lib/libc.so.6 
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.7.el6.x86_64 libgcc-4.4.4-13.el6.x86_64 libstdc++-4.4.4-13.el6.x86_64 
(gdb) bt 
#0 0x0000003ade478f94 in _int_malloc() from /lib/libc.so.6 
#1 0x0000003ade4796d8 in calloc() from /lib/libc.so.6 
#2 0x0000000000daf00d in myfunction (ipl=0x106f75f0, flds=11) 
    at myfile.c:1286 

隨着調試的一部分,我下面就gdb的提示:

幀2進入到用戶代碼堆棧幀的變量 和打印值(FLDS,指針(IPL),他們似乎否。 ñ ULL解除引用顯然。

但仍然calloc()失敗,並在那裏崩潰。這段代碼先前已成功執行多次,但稍後應用程序運行一段時間後會崩潰。 (Mem漏洞??嘗試獲取valgrind運行它,但它碰巧在valgrind memcheck工具下運行時,我的代碼崩潰的行爲是不可重複的)

我正在尋找一些指針來幫助我調試和修復這個。

某些相關信息 - gcc:4.4.4。紅帽企業Linux服務器6.0 64位Linux

+1

很有可能你損壞了堆並銷燬了* alloc()內部數據結構。找到這樣一個錯誤的更簡單的方法是通過'valgrind'運行你的程序。 – FatalError

回答

4

您可能有一個損壞的堆,例如,一些內存這已經free -d太早(仍然重複使用),或者一些緩衝區溢出(或無效的訪問像ptr[-3]

您應該使用valgrind調試等問題。

您也可以使用Boehm's conservative garbage collector

你也可以用gdb手動捕獲這樣的錯誤。使用watch gdb命令和禁用address space layout randomization應該有所幫助。

我還建議經常清除您擁有free -d一個指針,所以處處替換用free(x)free(x), x=NULL代碼(所以如果x被錯誤地廢棄時,你會得到一個SIGSEGV立即)。

您可能還會使用更新版本的GCC(當前版本爲4.7)及其堆棧保護功能。見this question

+1

我不會在任何地方推薦Boehm gc,更不用說在C初學者。這是「越糟越好」的典型例子,肯定會導致充滿內存泄漏和UB的可怕代碼。 –

+0

不一定:您可以選擇在所有C代碼中使用Boehm的GC ... –

+0

而且它仍然會不正確,並且經常處於攻擊者的控制之下,會導致內存泄漏和內存耗盡。這是*保守* GC的含義。見http://stackoverflow.com/questions/4039274/was-there-a-specific-reason-garbage-collection-was-not-designed-for-c/4039474#4039474 –