【问题标题】:How to get core dump from stopped program (linux)如何从停止的程序中获取核心转储(linux)
【发布时间】:2011-01-31 15:32:25
【问题描述】:

我有一个程序,被kill -STOP 停止。我想在不运行它的情况下获取它的核心转储(程序必须一直停止;如果它会收到一个 SIGCONT,它会在没有 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 并保存一个核心,它将被损坏。 “无法从内存中读取有效的对象文件图像。”

【问题讨论】:

    标签: linux gdb coredump


    【解决方案1】:

    使用gdb 附加到当前进程并发出generate-core-file 命令。

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

    【讨论】:

    • 我可以从进程中分离而不启动它吗? (我希望它在分离后停止)
    • 是的,您不必启动它。但是,如果您只想要核心文件,gcore 是最简单的方法,因此您根本不会弄乱现有流程。
    • dd: 寻找..ok; read(0, buf, 1) = -1 ESRCH (没有这个过程)
    【解决方案2】:

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

    如果由于某种原因重新启动进程不是一个选项,您可以尝试检查伪文件 /proc/[pid]/mem,但它不是核心格式,所以它不太可用。

    【讨论】:

    • 要转储 proc/pid/mem,我应该使用 proc/pid/mem 中的映射并只读取映射区域?
    • ABRT不行,因为我觉得这个过程有ulimit -c = 0
    猜你喜欢
    • 1970-01-01
    • 2016-06-14
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 2021-10-29
    相关资源
    最近更新 更多