2013-08-05 40 views
6

Core dump的維基百科頁面稱是否是可自行執行的核心轉儲?

在類Unix系統中,核心轉儲一般採用標準的可執行 圖像格式:

a.out in older versions of Unix, 
ELF in modern Linux, System V, Solaris, and BSD systems, 
Mach-O in OS X, etc. 

這是否意味着一個核心轉儲可執行本身?如果不是,爲什麼不呢?

編輯:由於@ WumpusQ.Wumbley在評論中提到一個coredump_filter,也許上面的問題應該是:可以核心轉儲產生,使得它本身的可執行?

+0

如果要執行核心轉儲,結果會如何? – icedwater

+0

我相信(但不確定)核心轉儲還包含來自原始可執行文件的機器指令,因爲它們是該進程的內存映像的一部分。如果是這樣,我希望它能夠運行這些說明。我完全不清楚這是否會發生,如果會發生,是重新開始還是嘗試從存儲狀態繼續執行(也可能再次崩潰),因此這個問題。 – sundar

+5

undump:http://code.google.com/p/undump/ –

回答

6

在舊的Unix變種它是包含文本的默認,以及在覈心轉儲數據,但也有人在給定a.out格式而不是ELF。今天的默認行爲(當然在Linux中,並非100%確定有關BSD變體,Solaris等)是以ELF格式進行核心轉儲而不包含文本部分,但可以更改此行爲。
但是,如果沒有任何幫助,核心轉儲無法直接執行。原因在於簡單的核心文件中缺少兩件事。一個是入口點,另一個是在轉儲發生之前或之前將CPU狀態恢復到狀態的代碼(缺省情況下,缺少文本部分)。
在AIX中曾經有一個名爲undump的實用程序,但我不知道它發生了什麼。它並不存在於我所知的任何標準Linux發行版中。如上所述(@WumpusQ),上面的評論中也提到了一個針對Linux的類似項目,但是這個項目並沒有完成,並且不會將CPU狀態恢復到原始狀態。但是,在某些特定的調試情況下,它仍然足夠好。
還值得一提的是,還有其他ELF格式的文件不能執行,也不是核心文件。比如對象文件(編譯器輸出)和.so(共享對象)文件。那些在運行之前需要一個鏈接階段來解析外部地址。

+0

非常感謝您的明確解釋,關於.o和.so文件的觀點是我沒有想到的有效觀點。 我還從'undump'實用程序的創建者那裏獲得了有關入口點等的類似答案,爲了完整起見,我現在將其發佈爲另一個答案。我接受你的回答,但現在就開放賞金,以防萬一。 – sundar

+0

「undump」概念的另一個大問題是,你失去了所有與在崩潰時打開的文件描述符相關的狀態。 –

+0

@ WumpusQ.Wumbley是的,'undump'的創建者在他的電子郵件中提到了這個問題,我已經發布了這個答案作爲這個問題的另一個答案。 – sundar

1

有兩種類型的核心轉儲:系統核心轉儲和進程核心轉儲。它們在許多方面有所不同,例如它們的創建方式和分析方法。

在大多數情況下,導致應用程序崩潰的信號是SIGSEGV(分段違例)或SIGBUS。

相似類型信號的觸發核心轉儲..也許調用它..

1

我通過電子郵件發送這個問題undump效用他的專業知識的創造者,並得到了如下答覆:

正如一些答案有提到,有可能包括 通過設置代碼段coredump_filter,但它不是Linux的默認設置(我不完全確定BSD變種和 Solaris)。如果各種代碼段保存在原始的 核心轉儲中,那麼爲了創建新的 可執行文件確實沒有任何缺失。但是,它確實需要對原始的 核心文件進行一些更改(例如,包括入口點並指向條目 指向將恢復CPU寄存器的代碼)。如果以這種方式修改了核心文件 ,它將成爲可執行文件,您將可以使用 來運行它。不幸的是,有些州不會保存 ,所以新的可執行文件將無法直接運行。打開 文件,套接字,點等將不會打開,甚至可能指向 其他FD(這可能導致各種奇怪的事情)。然而, 對於大多數調試任務(例如從gdb運行 小函數(這樣您就不會收到「不運行可執行文件」的東西)。

0

正如其他人說的,我不認爲你可以執行沒有原始二進制文件的核心轉儲文件。

如果您有興趣調試二進制文件(並且它包含調試符號,換句話說,它沒有被剝離),那麼您可以運行gdb binary core

在gdb裏面你可以使用bt命令(回溯)在應用程序崩潰時獲取堆棧跟蹤信息。

相關問題