目前,我抓住SIGSEGV,發送自己的電子郵件,然後放棄(),以便我可以得到一個核心文件並調試我的程序。 (如果我沒有捕捉到,將不會有我不知道我的特定程序會被忽略的情況。我的程序在我自己的服務器上運行。)推薦信號來捕捉?
是否還有其他信號可以捕獲調試還是因爲我應該知道的原因?
目前,我抓住SIGSEGV,發送自己的電子郵件,然後放棄(),以便我可以得到一個核心文件並調試我的程序。 (如果我沒有捕捉到,將不會有我不知道我的特定程序會被忽略的情況。我的程序在我自己的服務器上運行。)推薦信號來捕捉?
是否還有其他信號可以捕獲調試還是因爲我應該知道的原因?
是什麼讓你認爲SEGV已經不是已經損壞你的程序內存太多了,以致試圖發送電子郵件不會失敗壯觀?
您應該遵循責任分工的實踐,並從完全不同的程序中監控您的程序。
只要有一個(非常簡單所以它不太可能會失敗)程序,檢查,以確保您的主要程序仍在運行,如果沒有,您發送該電子郵件。你甚至可以做深度防守並運行兩個檢查器,兩者都檢查主程序和對方。
如果你是偏執狂和我一樣,你甚至可以在不同的機器上運行他們:-)
好,因爲使用signal.h中不能保證正常工作,這個怎麼樣:1)從我的程序2.刪除signal.h中)把作爲的setrlimit在我的程序的第一行,所以我可以得到一個核心3)使用通過一個cronjob執行的shell腳本,檢查覈心文件和發郵件給我,如果有 – 2011-03-14 10:48:17
我認爲,在Linux上,SIGSEGV除非有人已經採取具體行動,以阻止發生,它會自動給你一個核心轉儲。如果是這樣,下次程序啓動時,它可以檢查其工作目錄中的核心,然後發送電子郵件。這一點,我認爲是這樣的最崩潰記者OS X上運行 – JeremyP 2011-03-14 10:51:13
@JeremyP:SIGSEGV轉儲核心,但核心是默認的Linux發行版禁用的,所以你不得不使用了setrlimit修改軟限制(假設硬限制不零或者你需要root權限)。 – 2011-03-14 10:56:48
好吧,如果你的程序連接到控制檯,您可能想趕上SIGINT轉儲/刷新所有緩衝區/記錄你的預扣。
你可能不應該趕上SIGSEGV/SIGBUS等
你應該做的,而不是,是編寫一個包裝程序,它會檢測是否從信號子進程退出,並找出問題,那麼該進程能繼續下去採取任何必要的行動。
如果它是一個服務器進程,你可能還需要重新啓動,如果它意外失敗。
你絕對不應該趕上SIGSEGV。 – JeremyP 2011-03-14 10:43:39