2012-03-13 12 views
0

我正在調試OSX上的一個shell腳本,中間有神祕的segfault。如果在腳本之外執行,則有問題的命令不會發生段錯誤。是否可以配置GDB,以便在正常程序終止時自動退出?

所以我需要以附加GDB的腳本運行所有程序,所以我可以調試此段錯誤。是否可以配置GDB,這樣它將運行程序並退出程序正確終止?我曾嘗試下面的代碼:

echo file ifconfig > gdbcfg 
echo run >> gdbcfg 
echo quit >> gdbcfg 
gdb -x gdbcfg 

但這不是工作,因爲GDB嘗試應用正常終止:(前執行quit命令是否有可能以某種方式指示GDB等待應用程序正常終止,之後退出。 ?

也許我的做法是太情結,它只是一些GDB標誌像「加載和運行該應用程序,退出如果一切正常」?

回答

1

爲什麼不只是使這一進程轉儲核心文件,並對其進行分析後來用gdb?我的意思是ulimit -c unlimited然後(在覈心被轉儲後)gdb ./process核心?

+0

我用nix工具鏈不太好,所以這個方法在技術上對我很難,問題太多。我不知道如何讓shell腳本在第一段錯誤後停止(以及第一段後面的段錯誤在哪裏)。我不知道如何正確地轉儲核心並將其加載回GDB。所以我認爲就在每個應用程序開始之前,在shell腳本中,並打入GDB將是最簡單的解決方案:)。 – grigoryvp 2012-03-13 16:44:43

+0

ulimit -c unlimited將強制崩潰進程轉儲名爲「core」的核心文件。你可以讓你的腳本在每個命令後檢查「核心」文件,如果存在則退出(如果[-f core];然後退出; fi)退出。然後運行gdb,第一個參數是崩潰的進程,第二個參數是核心文件名(「core」)。就這樣。 – strkol 2012-03-13 16:56:34

1

但是,這是行不通的,因爲GDB試圖執行應用程序終止

之前沒有退出命令:它不工作,因爲(假設您貼上您實際碼)gdbcfg包含單個quit後你的命令被執行(並且沒有run)。你想要的是:

echo file ifconfig > gdbcfg 
echo run >> gdbcfg 
echo quit >> gdbcfg 
gdb -x gdbcfg 

拼出一個更UNIXy方法是:

echo >gdbcfg <<EOF 
file ifconfig 
run 
quit 
EOF 

gdb -x gdbcfg 

更新:

如果gdbcfg文件內容包含所有三個命令,那麼你的理解問題是不正確:在執行下一個命令之前,GDB將等待每個命令完成。

+0

對不起,這是在這裏發佈的代碼示例中的拼寫錯誤。實際文件是用vi編輯的,並且有全部3個命令:(P.S.ЗатрюксEOFспасибо,как-тояпрогляделтакойочевидныйспособиспользованияheredoc :) – grigoryvp 2012-03-13 16:55:07

相關問題