我正在寻找一种方法来对 Linux 上正在运行的进程进行非侵入式核心转储。
我熟悉 gdb gcore
,但它只能在gdb
连接到进程并停止调试时运行。对于大型核心转储,这可能意味着执行中断数秒甚至几分钟。
有没有非阻塞的替代方案?
Linux 支持写时复制内存,它依靠fork()
该内存来支持exec()
。因此,我正在考虑内核级别的某些东西,其中内核对正在转储的进程的进程页表进行写时复制快照,然后在原始进程继续运行的同时将核心写出。
我确信我可以使用gdb
强制fork()
然后抛弃子进程,而父进程则继续愉快地运行,然后wait()
在终止后让父进程收割子进程。不过,这很麻烦,而且仍然需要中断父进程两次,尽管中断时间很短。
肯定有人以前需要过这个吧?
答案1
谷歌CoreDumper突然想到了。它对进程的地址空间进行写时复制,请参阅写入核心转储()(见“注释”)。