2011-04-26 38 views
2

我運行我的程序時出現以下錯誤,它不會在gdb下發生。我如何強制glibc或ubuntu轉儲核心放棄?我嘗試了「ulimit -c unlimited」。但是,這不是一個seg故障,也不是運氣。另外,我在valgrind修復中有太多內存錯誤,所有這些都會花費很多時間。強制coredump上glib自由錯誤

此外,將MALLOC_CHECK_設置爲0不會強制程序退出。但是,這不是我的選擇。

* glibc的檢測 ./main:免費():無效的下一個尺寸(快速):0x0000000000ae0560 * *

編輯 無論如何,我發現究竟是什麼造成的valgrind這個glibc的腐敗。只是保持開放,看看是否有可能。

+1

您可能有堆損壞或「雙重釋放」或內存管理的另一個問題 - 一種問題,你應該儘快解決而不是修補。 – sharptooth 2011-04-26 07:21:42

+0

重複的http://stackoverflow.com/questions/151268 btw ...? – 0xC0000022L 2011-04-26 11:30:08

+0

這不是重複的。默認情況下,glibc在我的ubuntu中中止。我想要的是一個coredump文件,當它中止時。 – user357689 2011-04-26 16:57:08

回答

3

使用Valgrind來診斷並修復的問題。它會更快更直接,因爲這確實看起來像一個典型的堆腐敗。

如果您使用普通版本,可能會有一個(Valgrind)軟件包可用於您的發行版。

創建核心轉儲的唯一方法是在發生之前將GDB附加到進程。但是,這仍然不會讓你更接近導致問題的解決方案。 Valgrind是最好的方法。

+0

我說我在使用valgrind,而且在我的第一個問題中我有很多錯誤(2k +)。這個庫不是我的代碼。所以,我想從一些關鍵問題開始,然後走下去,因此希望從gdb中獲得coredump。 – user357689 2011-04-26 16:55:31

+0

@ user357689:Valgrind中的錯誤並不總是必須首先出現錯誤(這就是忽略文件存在的原因),其次,一個根本原因通常會導致數百條出錯的行。不過,只有根本原因是相關的。固定時,下一次運行通常會有相當少的錯誤。注意:重要的部分(因此強調)是錯誤應該是固定的,而不是僅僅被診斷。隨時投入學習Valgrind及其產出不會被浪費。 – 0xC0000022L 2011-04-26 17:01:03

5

從glibc的documentation

如果MALLOC_CHECK_被設置爲0,任何檢測到堆損壞被自動忽略;如果設置爲1,則在stderr上打印診斷;如果設置爲2,立即調用abort。

調用abort()通常產生核心轉儲(根據ulimit -c設置)。