2009-04-22 62 views
9

有時當我運行我的代碼時,當我通過終止程序生成一個核心轉儲文件時,按Ctrl + \。文件名的格式爲core.*。程序沒有突然終止,也沒有分段錯誤。我相信它是SIGQUIT而不是SIGABRTSIGSEGV。如果我嘗試Ctrl + CCtrl + Z,則不生成。爲什麼生成核心轉儲文件?

誰能告訴爲什麼當按下Ctrl鍵+\它只是產生?我如何避免生成這個核心轉儲文件?有沒有用於核心轉儲文件?

+0

當你說「運行我的代碼」時,你在說什麼時候運行make?或者當你運行編譯的二進制文件? – harto 2009-04-22 06:07:25

回答

17

當程序由於程序錯誤而被操作系統終止時,進程會轉儲核心。發生這種情況的最典型原因是程序訪問了一個無效的指針值。鑑於你有一個零星的轉儲,很可能你正在使用一個未初始化的指針。

你能發佈導致錯誤的代碼嗎?除了模糊的概括外,很難在沒有看到代碼的情況下猜測出什麼是錯的。

至於什麼是核心轉儲實際上是,看看這個維基百科文章:

+5

在Linux中,即使程序沒有錯誤並且在終止時運行正常,Ctrl + \也會導致核心轉儲。 – ely 2013-07-12 20:41:27

5

它在調試功能,表現不好的應用程序,以幫助的工具。它很大,因爲它包含所有應用程序物理內存在其死亡時的內容以及所有線程的寄存器狀態和堆棧。

當內核殺死應用程序執行某些惡意操作時(例如生成分段違例或總線錯誤),它們會生成。

+0

嗡嗡聲...它只包含processus內存的轉儲,但仍然可能是相當多的內存。 – Ben 2009-04-22 07:37:11

7

當進程收到某些信號時(例如SIGSEGV,內核在其地址空間外訪問內存時發送它)時,會生成核心轉儲。通常情況下,這是因爲使用指針的錯誤而發生的。這意味着程序中存在一個錯誤。

核心轉儲對於發現錯誤非常有用。它是問題發生時進程內存的映像,因此可以使用諸如gdb之類的調試器來查看程序正在執行的操作。調試器甚至可以訪問(有時)程序中變量的值。

您可以使用ulimit命令防止發生核心轉儲。

10

正如其他人所說,核心轉儲是程序故障的結果。

您可以配置是否使用ulimit命令生成核心轉儲。輸入

ulimit -c 0 

禁用活動shell中的核心文件生成。

如果生成核心的程序與符號信息內置,你可以做一個post mortem debugging session這樣的:

gdb <pathto/executable> --core <corefilename> 
2

您可以避免通過編寫代碼創建一個核心轉儲文件不會崩潰:)

嚴重的是,核心轉儲很有用,因爲您可以在程序崩潰時看到程序的狀態,以便進行「驗屍」調試。您可以在gdb中打開它們並檢查程序的狀態(特別是如果它是通過調試構建的)。

核心轉儲通常會得到做,如果程序有一個SIGSEGV(通常是無效的指針引用造成的),SIGABRT(假若你叫中止()發生,或者在C++中通過預設終止()處理程序中的析構函數例外等)或其他一些故障。您也可以使用調試器或編程方式顯式觸發它們。

如果你已經修復了所有的錯誤並且它是完美的,你可以刪除它們。另外,如果您已經以任何方式更改程序(並重新編譯它),那麼它們將變得毫無用處,因爲現在調試信息與核心轉儲中的內容不匹配,因此您也可以刪除它們。

6

ctrl + \向進程發送SIGQUIT信號。根據POSIX.1標準,此信號的默認操作是生成一個內核。

SIGILL,SIGABRT,SIGFPE,SIGSEGV是系統生成內核時的其他情況。

請參閱您系統上的「man 7 signal」瞭解更多詳情。

1

點的Ctrl + \是生成一個核心轉儲。這就是SIGQUIT所做的。如果您不希望它被生成,請使用Ctrl + CSIGINT)代替。如果有問題的程序沒有響應SIGINT,但您需要從終端上終止它,則無論您或開發人員做錯了什麼。

程序設計從終端殺害與按Ctrl +ç依然優雅地迴應SIGTERM,可以在另一端通過kill -TERM ...觸發。如果一切都失敗,SIGKILL將強制立即終止。