2014-02-13 79 views
0

我正在重寫一個自定義的malloc,我希望能夠拋出glibc錯誤時,雙免費或腐敗,而不是經典的SegFault。這可能嗎?如何編寫一個自定義的引發glibc的自由?

*** glibc detected *** a.out: double free or corruption (fasttop): 0x0804b048 *** 
======= Backtrace: ========= 
/lib/libc.so.6(+0x6ff0b)[0xb74baf0b] 
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb7671b4f] 
/usr/local/gcc/gcc-cilk/lib/libstdc++.so.6(_ZdaPv+0x1b)[0xb7671b9b] 
a.out[0x8048983] 
a.out[0x8048b12] 
a.out[0x80487d7] 
ffffe000-fffff000 r-xp 00000000 00:00 0   [vdso] 
Aborted 
+1

'glibc detected'只表示錯誤被'glibc'檢測到,它不是一種錯誤。 – immibis

+0

使用調試信息('g-g'標誌爲'gcc')構建您的程序,然後回溯將顯示文件名和行號。 –

回答

1

我不認爲它可以很容易地完成,因爲當兩次調用free()兩次時,沒有任何異常被拋出 - 就像在嘗試分配內存和alloc失敗的情況下 - 這是相當未定義的行爲。 查看更多詳情this post

你可以做的是實現你自己的機制來跟蹤分配/解除分配的內存 - 有點像智能指針的工作方式。只有你會特別試圖識別內存何時被釋放兩次。

0

我認爲你必須做你自己的回溯/錯誤消息,並顯示在錯誤輸出。

你也應該看看中止(3)。

0

如果你想拋出錯誤而不是段錯誤,你必須檢查有什麼可能做段錯誤,然後返回你想要的消息。你可以捕捉它並將其重定向到一個可以檢查的函數中。

您可以檢查內存是否已經空閒。

你是如何完成自定義malloc的? brk和sbrk?