转储进程核心而不杀死进程

Fal*_*rri 13 process debugging core-dump gdb

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

我希望这个问题是有道理的。

gee*_*aur 16

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

from os import fork, abort
(...)
def onUSR1(sig, frame):
    if os.fork == 0:
        os.abort
Run Code Online (Sandbox Code Playgroud)

并在初始化期间

from signal import signal, SIGUSR1
from wherever import onUSR1
(...)
signal.signal(signal.SIGUSR1, wherever.onUSR1)
Run Code Online (Sandbox Code Playgroud)

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

曾几何时,这个技巧被用于undump从核心转储生成可执行文件以在复杂初始化后保存图像的程序。emacs过去常常这样做以从temacs.


Leo*_*nid 6

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