如何从停止的程序中获取核心转储文件(Linux)

3

我有一个程序,用 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并保存一个核心文件,它将会损坏。"无法从内存中读取有效的对象文件图像。"
2个回答

7

使用 gdb 命令附加到当前进程,并执行 generate-core-file 命令。

或者您可以运行 gcore 命令并将进程ID作为参数提供。


我可以在不启动进程的情况下分离它吗?(我希望在分离后它被停止) - osgx
是的,你不需要启动它。如果你只想要核心文件,gcore 是最简单的方法,这样你就完全不会干扰现有的进程。 - Mark Loeser
dd:定位完毕..好的; read(0,buf,1)= -1 ESRCH(没有这样的进程) - osgx

0

在进程停止时发送 ABRT 信号,然后使用 CONT 重新启动它。它将转储核心并中止。

如果由于某种原因无法重新启动进程,则可以尝试检查伪文件 /proc/[pid]/mem,但它不是核心格式,因此可用性较低。


我应该使用proc/pid/mem中的映射并仅读取映射区域来转储proc/pid/mem吗? - osgx
ABRT无法工作,因为我认为此进程的ulimit -c = 0。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接