有没有办法在不实际终止进程的情况下获取进程的核心转储(或类似的东西)?我有一个在嵌入式系统上运行的多线程 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
.这是你的选择吗?