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


12

有没有一种方法可以在不真正杀死进程的情况下获得进程的核心转储(或类似的东西)?我有一个在嵌入式系统上运行的多线程python进程。而且我希望能够在正常情况下(例如,需要运行其他进程)获取该进程的快照,但是如果没有python进程,我没有足够的内存来连接gdb(或在gdb下运行)是唯一的跑步。

我希望这个问题有意义。


如果只是在调试时,您是否考虑过诸如在NFS文件或网络块设备上进行交换之类的疯狂事情?
吉尔(Gilles)'所以

Answers:


13

通常的技巧是让某物(可能是信号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


5

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


在某种程度上,gcore是一个独立程序,但我认为它不再是gdb软件包的一部分-但是您可以运行gdb --pid = <PID>,然后使用它的gcore命令来转储核心文件。gcore.c是一个相当简单的程序,如果您想减轻重量,可以很容易地进行搜索。
synthesizerpatel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.