2011-01-31 44 views
3

我有一個計劃,這是由kill -STOP停止。我想在不運行它的情況下獲取它的核心轉儲(程序必須始終停止;如果它將收到SIGCONT,它將在沒有coredump的情況下死掉)。我怎樣才能得到一個coredump?如何從停止的程序(Linux)的核心轉儲

是否有可能保持程序在其當前狀態服用後核心轉儲?這是一種非常罕見的情況,我不能重現它,但我必須分析它。

感謝

更新:的gcore不起作用。 Gdb(甚至是根目錄)不能附加到已停止的進程(在ptrace PTRACE_ATTACH上永遠等待)。即使dd無法從/ proc/99999/maps中讀取具有良好偏移量的/ proc/99999/mem(錯誤爲No such process)。

如果我嘗試GDB和進程和發送SIGCONT到停止過程中,我得到了

path... linux-nat.c:####: internal-error: linux_nat_attach: Assertion `pid == GET_PID (inferior_ptid) && WIFSTOPPED (status) && WSTOPSIG (status) == SIGSTOP' failed. 
A problem internal to GDB has been detected, 
further debugging may prove unreliable. 
A problem internal to GDB has been detected, 
further debugging may prove unreliable. 

如果我去了GDB和保存核心,它都將被破壞。 「無法從內存中讀取有效的目標文件圖像。」

回答

6

附加到當前進程與gdb併發出generate-core-file命令。

也可以運行gcore並提供進程ID作爲參數。

+0

我可以從進程分離,而無需啓動呢? (我想讓它在分離後停止) – osgx 2011-01-31 18:04:36

+0

是的,你不必開始它。如果你只是想要核心文件,`gcore`是最簡單的事情,所以你根本不要惹惱現有的進程。 – 2011-01-31 19:10:52

0

發送過程中的ABRT信號而被停止,然後用CONT重新啓動它。它會轉儲核心並中止。

如果重新啓動進程,由於某種原因它不是一個選項,你可以嘗試檢查僞文件/ proc/[pid]/mem,但它不是核心格式,所以它不太可用。