2016-02-14 157 views
3

我正在研究一個包含許多斷言的項目(因爲它應該)。問題是,我無法讓GDB斷言斷言失敗;它只是打印一個很好的斷言失敗消息並中止程序。根據之前發佈的帖子,我無意中發現以下幾個斷點:如何讓GDB停止斷言失敗?

break g_log if log_level == G_LOG_LEVEL_CRITICAL 
break g_log if log_level == G_LOG_LEVEL_WARNING 
break __assert 
break _assert 
break abort 
break exit 
break __assert_fail 

GDB接受並列出所有這些爲活動斷點。 無論如何,沒有休息,只是一個漂亮的「斷言失敗...」的消息,並在程序停止...提前 感謝, 最好的問候,戴維

回答

3

問題是,我不能讓GDB到在一個斷言失敗

通常打破,你不必做任何事情abort發送SIGABRT的過程,GDB捕捉默認。你應該能夠通過編譯這個測試用例來確認這一點:

#include <assert.h> 
int main() { assert(0 == 1); return 0; } 

並在GDB下運行它。

你的問題的最可能的原因是,你正在調試錯誤的過程,而不是實際中止之一。也許這是孩子的過程,實際上失敗了斷言?

的GDB set follow-fork-mode這可能有所幫助。

的另一種方式,你可以調試即是通過與更換標準__assert_fail:(上面的代碼只是鏈接到你的主執行程序,它應該「先佔」的__assert_faillibc.so複印件)

#include <stdio.h> 
int foo; 
void __assert_fail(const char *assertion, const char *file, int line, 
        const char *function) 
{ 
    fprintf(stderr, "MY assertion failed: %s in %s, %s:%d\n", 
      assertion, function, file, line); 
    while (foo == 0) /*spin*/; 
} 

現在

時斷言失敗,該進程將永遠自旋,而不是與SIGABRT死亡,這將讓你找到它(在如top)和附加到它與GDB。