Linux上的非阻塞核心转储?


24

我正在寻找一种在Linux上进行正在运行的进程的非侵入式核心转储的方法。

我对gdb很熟悉gcore,但是只有在gdb附加到进程中并停止调试时才能运行。对于大型核心转储,这可能意味着几秒钟甚至几分钟的执行中断。

有没有其他非阻塞性选择?

Linux支持写时复制内存,它依赖于fork()不带exec()。因此,我正在考虑某种内核级别的操作,其中内核为正在转储的进程的进程页表创建写时复制快照,然后在原始进程继续运行的同时将内核写出。

我敢肯定,我可以gdb强迫fork()父母抛弃孩子,然后wait()让父母快乐地继续生活,然后在父母解雇后再让孩子收割。但是,这很麻烦,尽管短暂,但仍需要中断父进程两次。

肯定有人需要吗?


很抱歉,我只能对这个绝妙的问题只作一个表决。
彼得说恢复莫妮卡2014年

一个非常好的问题,我很期待这个答案。从我+1
thanasisk

1
怎么样1)用gdb附加进程2)让它通过“调用fork”命令分叉3)转储子进程的核心4)让已死亡的孩子由父级等待(另一个“调用wait4”)5 )从过程中分离出来6)自动化1-5吗?Gdb使用简单的sys_ptrace()系统调用,它可能是一个完全独立于gdb的不太复杂的C工具。
彼得说恢复莫妮卡2014年

1
在虚拟机上,您可以拍摄快照并将其作为克隆进行分析。也许这里列出的工具之一可以为您提供帮助:cyberciti.biz/programming/linux-memory-forensics-analysis-tools
Giovanni Tirloni 2014年

1
您可以通过使子进程也分叉然后退出来避免第二次中断。然后,父进程可以立即等待孩子,然后继续,而祖父母转储核心。
kasperd 2014年

Answers:


1

Google CoreDumper浮现在脑海。它将对进程的地址空间进行写时复制,请参见WriteCoreDump()(请参见“注释”)。


看起来非常有用!我不知道所使用的底层技术是什么。大概它跟踪了该过程,但是创建CoW快照而不进行分叉并且以不影响堆栈的方式进行将是具有挑战性的。我将不得不看一下代码。大提示。
Craig Ringer 2014年

不幸的是,它看起来仅是进程内的,无法通过gdb或类似方法调用,因为它需要ptrace自身。因此,它有点像Windows下的debughelp DLL,而不是非阻塞gcore,但看起来还是很方便的。我想可以通过LD_PRELOAD钩子和gdb设置信号处理程序,分离并用信号通知进程来使用,但看起来它不是真的设计来转储未经修改的程序,并且存在共享的问题通过任何进程内转储工具,如果进程混乱不堪,转储将无法进行。
Craig Ringer 2014年

抱歉……当我初次阅读该问题时,我错过了“非侵入式”的介绍。
EricM 2014年
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.