2013-11-24 55 views
15

我不知道是否有可能通過GDB啓動應用程序,在一個段錯誤寫回溯到一個文件(在稍後看),然後退出GDB完全不需要任何用戶輸入。沒有用戶輸入的gdb回溯?

我在一個無限循環(所以如果它崩潰,重新加載)在OS的啓動從一個非交互式會話中運行一個shell腳本的應用程序。該應用程序以不可重現的方式崩潰,所以我需要從崩潰中回溯以調試問題。理想情況下,我只是修改shell腳本以包含GDB調試+回溯功能,並保留崩潰後應用程序的自動重新啓動。

這可能嗎?

+2

http://www.commandlinefu.com/commands/view/4039/print-stack-trace-of-a-core-file-without-needing-to-enter-gdb-interactively –

+2

你不能啓用核心你的系統上的文件並以這種方式獲取回溯?看起來比gdb循環更容易。 –

+0

'所以我需要從崩潰回溯調試issue.' - 我還沒有找到一個答案,爲什麼你不能從崩潰分析的核心文件?這是因爲它相當大嗎? –

回答

17

由於阿迪蒂亞·庫馬爾;可接受的解決方案:

gdb -batch -ex "run" -ex "bt" ${my_program} 2>&1 | grep -v ^"No stack."$

1

這個工程使用gdb 7.6:

我的測試程序,它會導致核心轉儲如果它被賦予一個命令行參數:

int a(int argc) 
{ 
    if (argc > 1) { 
    int *p = 0; 
    *p = *p +1; 
    return *p; 
    } 
    else { 
    return 0; 
    } 
} 

int b(int argc) 
{ 
    return a(argc); 
} 

int main(int argc, char *argv[]) 
{ 
    int res = b(argc); 
    return res; 
} 

我的Python腳本my_check .py:

def my_signal_handler (event): 
    if (isinstance(event, gdb.SignalEvent)): 
    log_file_name = "a.out.crash." + str(gdb.selected_inferior().pid) + ".log" 
    gdb.execute("set logging file " + log_file_name) 
    gdb.execute("set logging on") 
    gdb.execute("set logging redirect on") 
    gdb.execute("thread apply all bt") 
    gdb.execute("q") 

gdb.events.stop.connect(my_signal_handler) 
gdb.execute("set confirm off") 
gdb.execute("set pagination off") 
gdb.execute("r") 
gdb.execute("q") 

因此,首先我運行a.out和沒有崩潰。沒有日誌文件被創建:

的gdb -q -x my_check.py --args ./a.out>的/ dev/null的

下一頁我的a.out運行,並給它一個參數:

>gdb -q -x my_check.py --args ./a.out 1 >/dev/null 

這是一個崩潰報告:

>cat a.out.crash.13554.log 

Thread 1 (process 13554): 
#0 0x0000000000400555 in a (argc=2) at main.cpp:5 
#1 0x000000000040058a in b (argc=2) at main.cpp:15 
#2 0x00000000004005a3 in main (argc=2, argv=0x7fffffffe198) at main.cpp:20 
0

或者只是存儲回溯,你可以把ulimit -c unlimited在您的shell腳本的無限循環之前。其結果將是,每次你的程序段錯誤,它會寫一個核心轉儲到這我的系統上就被稱爲core,但對其他系統可能包括進程ID文件。如果程序存在段錯誤(您從退出狀態中看到此錯誤等於139),那麼只需使用唯一名稱(例如使用時間戳)將core文件移動到安全位置。有了這些核心文件和gdb,你就可以做更多的事情,而不僅僅是看回溯。因此我想用它們可能對你更有用。