2012-04-17 119 views
3

所以當glibc崩潰時,它有一個* glibc檢測到*崩潰消息。然後它打印一串回溯,就像覆蓋glibc崩潰

*** glibc detected *** ./odin: free(): invalid pointer: 0xbfba4444 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6(+0x6b161)[0xb75f9161] 
/lib/tls/i686/cmov/libc.so.6(+0x6c9b8)[0xb75fa9b8] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb75fda9d] 
/usr/lib/libstdc++.so.6(_ZdlPv+0x1f)[0xb77da2ef] 

一切都很好,但是當事情崩潰,我一直在這樣做回溯(),然後使用系統調用來addr2line和打印實際點其他情況該功能。但是當它發生glibc崩潰時,它會繞過我所稱的任何信號處理程序。

有沒有辦法對付這些glibc崩潰?

回答

3

這是一個記憶功能的選項,你可以使用mallopt來切換它。通過它的聲音,你想設置M_CHECK_ACTION爲零,以允許執行繼續,除非你想程序直接退出,在這種情況下,看看2允許你做你想做的。

這個小程序產生正常的glibc錯誤:test1.c
這一個忽略該錯誤並進行:test2.c
上的錯誤這一個中止:test3.c

3

IIRC,glibc的實際調用abort(),所以處理SIGABRT並從那裏打印回溯應該會給你所需要的信息。

但是,我建議嘗試valgrind:您收到的消息表明您有內存損壞問題。

副作用評論(抱歉,如果這是多餘的;-)):核心轉儲有時更有用,只是回溯。它們可以通過例如在bash中設置ulimit -c unlimited。當程序崩潰時,它會產生一個名爲core.的文件(或者只是core - 這取決於您正在運行的系統;如果系統運行abrtd,如果我沒有弄錯,核心文件將被放入/var/cache/abrt)。然後你可以使用gdb通過運行gdb -c core a.out來檢查覈心文件; gdb會話看起來就像進程剛剛崩潰了一樣。

+0

嗯,我的程序已經有信號(SIGABRT,等等)很長一段時間,他們沒有觸發(他們會打印一堆東西)**編輯**:他們實際上觸發了,我只是沒有沒有看到它。我也會嘗試valgrind,但是我不知怎麼的時候沒有被抓到。 – kamziro 2012-04-17 12:55:34