2013-07-31 62 views
0

我目前正在調試我一直在努力的一段時間的項目,並且遇到了一些涉及free的瘋狂錯誤。我無法上傳代碼,因爲無法確切地知道問題出在哪裏(大約2500行代碼被分成22個文件),但是我會解釋我所知道的。特有的錯誤免費

首先,gdb被用於整個調試過程。該錯誤似乎從致電free。我從gdb收到以下錯誤消息,該程序具有SIGABRT退出後:

*** Error in `application': free(): invalid next size (normal): 0x08052008 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x767e2)[0xb7e467e2] 
/lib/i386-linux-gnu/libc.so.6(+0x77530)[0xb7e47530] 
application[0x8049aef] 
application[0x804a8aa] 
application[0x8048bee] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0xb7de9935] 
application[0x8048a51] 
======= Memory map: ======== 
08048000-08050000 r-xp 00000000 00:16 1571817 application 
08050000-08051000 r--p 00007000 00:16 1571817 application 
08051000-08052000 rw-p 00008000 00:16 1571817 application 
08052000-08073000 rw-p 00000000 00:00 0   [heap] 
b7d9c000-b7db7000 r-xp 00000000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1 
b7db7000-b7db8000 r--p 0001a000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1 
b7db8000-b7db9000 rw-p 0001b000 08:01 1309022 /lib/i386-linux-gnu/libgcc_s.so.1 
b7dce000-b7dd0000 rw-p 00000000 00:00 0 
b7dd0000-b7f7d000 r-xp 00000000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so 
b7f7d000-b7f7f000 r--p 001ad000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so 
b7f7f000-b7f80000 rw-p 001af000 08:01 1308997 /lib/i386-linux-gnu/libc-2.17.so 
b7f80000-b7f83000 rw-p 00000000 00:00 0 
b7f83000-b7fc4000 r-xp 00000000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so 
b7fc4000-b7fc5000 r--p 00040000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so 
b7fc5000-b7fc6000 rw-p 00041000 08:01 1309045 /lib/i386-linux-gnu/libm-2.17.so 
b7fd9000-b7fdd000 rw-p 00000000 00:00 0 
b7fdd000-b7fde000 r-xp 00000000 00:00 0   [vdso] 
b7fde000-b7ffe000 r-xp 00000000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so 
b7ffe000-b7fff000 r--p 0001f000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so 
b7fff000-b8000000 rw-p 00020000 08:01 1308973 /lib/i386-linux-gnu/ld-2.17.so 
bffdf000-c0000000 rw-p 00000000 00:00 0   [stack] 

這似乎是類似雙自由常見,但還有更多。我傾向於在所有全局指針設置爲NULL,因爲它們不包含任何內容,所以即使我將其雙重釋放也不會導致錯誤。此外,由於我的應用程序涉及數據加密,所以我創建了自己的兩個函數,它們首先覆蓋內存,然後免費調用。

這個問題是否可以從超出界限的內存中讀取?例如,如果我有一個64字節的內存塊,並且不小心嘗試讀取第65個字節,那麼在調用free時是否會導致錯誤?我知道即使不是立即寫出界限,也會導致錯誤...

我一直在試圖找到一整天的錯誤,但沒有成功。 gdb爲我的情況提供了哪些工具(除了休息,步驟,繼續和觀看)?在內存分配和管理方面,我可以看到我的代碼真的做了什麼嗎?例如,是否有任何方法可以查看特定指針指向的位置中實際分配了多少內存?

預先感謝您的時間! :)

+0

你能顯示相關的代碼嗎? –

+0

正如我所說,問題出現在我的應用程序的特定部分,但可能在任何時候導致。我一遍又一遍地檢查了那部分,它工作正常。只有在整體工作時,程序纔會崩潰。我無法上傳22個文件! :D – someone

+0

「這個問題是否可以從超出界限的內存中讀取?」肯定是的,我已經看到這種情況經常發生 –

回答

5

由於覆蓋了未分配的內存,這種強烈的異味就像是內存管理受到破壞。

您可能希望使用Valgrind來分析此問題。

+0

您可否詳細說明valgrind? – someone

+0

Valgrind通過在沙箱中運行程序來觀察程序。明天你可能想閱讀這裏:http://valgrind.org/docs/manual/QuickStart.html – alk

+0

它在Ubuntu存儲庫中可用還是我要求太多? – someone

1

@alk已經回答,但我FYI添加此作爲行爲不端的自由功能的另一罪魁禍首:

如果指針到分配的內存塊已經移動到不同的位置:例如

char *string; 
    string = malloc(10); 
    string++;  //move memory pointer to location other than originally allocated 
    free(string); //attempt to free will result in error 

free正試圖釋放一個指針,不再指向分配的內容,並且總會拋出一個錯誤。

+0

噢,謝謝。我只使用[]運算符指針。它可以導致問題嗎? – someone

+0

@angel - 我通常只使用任何類型的指針將免費調用與malloc或calloc調用相匹配。我使用的東西如 – ryyker

+0

@angel - 對不起,在最後一次嘗試時不斷出現錯誤。你在免費使用什麼?你可以給我一個例子嗎?我從來沒有使用[]使用[]創造的任何東西,';因爲不是動態分配,這些是靜態定義的。沒有免費是必要的。 – ryyker