我有一个程序,由kill -STOP
停止。我想在不运行的情况下对其进行核心转储(程序必须一直停止;如果它将收到SIGCONT,它将在没有coredump的情况下死掉)。我怎样才能得到一个coredump?
在服用coredump后,是否可以将程序保持在当前状态?这是一种非常罕见的情况,我无法重现它,但我必须对其进行分析。
由于
更新:gcore不起作用。 Gdb(甚至root)无法附加到已停止的进程(在ptrace PTRACE_ATTACH上永远等待)。甚至dd都无法从/ proc / 99999 / mem中读取/ proc / 99999 / maps中的良好偏移量(错误为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并保存核心,它将被破坏。 “无法从内存中读取有效的目标文件图像。”
答案 0 :(得分:7)
使用gdb
附加到当前进程并发出generate-core-file
命令。
或者您可以运行gcore
并提供进程ID作为参数。
答案 1 :(得分:0)
在停止时向进程发送ABRT信号,然后使用CONT重新启动它。它将转储核心并中止。
如果由于某种原因重新启动进程它不是一个选项,你可以尝试检查pseudofile / proc / [pid] / mem,但它不是核心格式,因此它不太可用。