转储进程核心而不终止进程

转储进程核心而不终止进程

有没有办法在不实际终止进程的情况下获取进程的核心转储(或类似的东西)?我有一个在嵌入式系统上运行的多线程 python 进程。我希望能够在正常情况下获得进程的快照(即需要运行的其他进程),但我没有足够的内存来连接 gdb (或在 gdb 下运行它)而无需 python 进程是唯一一个正在运行的人。

我希望这个问题有意义。

答案1

通常的技巧是让某些东西(可能是像 之类的信号SIGUSR1)触发程序fork(),然后子进程调用abort()以使其自身转储核心。

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort

并在初始化期间

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)

以这种方式使用,fork不会消耗太多额外的内存,因为几乎所有的地址空间都将被共享(这也是为什么它可以生成核心转储)。

曾几何时,这个技巧被用在一个程序中,该程序被称为undump从核心转储生成可执行文件,以在复杂的初始化后保存图像;emacs用于执行此操作以从 生成预加载的图像temacs

答案2

你可以尝试使用gcore.这是你的选择吗?

相关内容