天天看點

強制程序産生coredump,檢測死鎖以及程序快照

作者:[email protected]

部落格:linuxfocus.blog.chinaunix.net

在軟體開發的過程中,無論如何努力,bug幾乎都是必不可少的。當某些bug發生時,該程序會産生coredump檔案。通過這個coredump檔案,開發人員可以找到bug的原因。但是coredump的産生,大都是因為程式crash了。

而有些bug是不會導緻程序crash的,比如死鎖——這時,程式已經不正常了,可是卻沒有coredump産生。如果環境又不允許gdb調試,難道我們就束手無策了嗎?針對這種情況,一般情況下,對于這樣的程序,可以利用watchdog監控它們,當發現這些程序很長時間沒有更新其heartbeat時,可以給這些程序發送可以導緻其産生coredump的信号。根據linux的信号預設的處理行為,SIGQUIT,SIGABRT, SIGFPE和SIGSEGV都可以讓該程序産生coredump檔案。這樣我們可以通過coredump來得知死鎖是否發生。當然,如果程序添加了這些信号的處理函數,那麼就不會産生coredump了。不過,對于SIGABRT, SIGFPE, SIGSEGV,有誰會為它們加上信号處理函數呢。

還有一種情況,程序并沒有死鎖或者block在某個位置,但是我們需要在某個指定位置進行調試,擷取某些變量或者其它資訊。但是,有可能是客戶環境或者生産環境,不允許我們進行長時間的檢測。那麼,我們就需要通過coredump來獲得程序在運作到該點時的快照。

這個時候,可以利用gdb來産生手工産生coredump。在attach上這個程序時,在指定位置打上斷點,當斷點觸發時,使用gdb的指令gcore,可以立即産生一個coredump。這樣,我們就拿到了這個位置的程序快照。

繼續閱讀