我有一个程序,用 kill -STOP
命令停止运行。我想在不重新运行程序的情况下获取它的核心转储(程序必须一直停止;如果接收到 SIGCONT 信号,它将死亡并无法生成核心转储)。请问如何获得核心转储?
在获取核心转储后,是否可能保持程序的当前状态?这是非常罕见的情况,我无法重现,但我必须进行分析。
谢谢。
更新:gcore 无法使用。Gdb(即使是 root)也无法附加到已停止的进程上(在 ptrace PTRACE_ATTACH 上等待超时)。即使使用好的偏移量从 /proc/99999/maps 中,dd 也无法从 /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并保存一个核心文件,它将会损坏。"无法从内存中读取有效的对象文件图像。"
gcore
是最简单的方法,这样你就完全不会干扰现有的进程。 - Mark Loeser