我正在寻找一种在Linux上进行正在运行的进程的非侵入式核心转储的方法。
我对gdb很熟悉gcore
,但是只有在gdb
附加到进程中并停止调试时才能运行。对于大型核心转储,这可能意味着几秒钟甚至几分钟的执行中断。
有没有其他非阻塞性选择?
Linux支持写时复制内存,它依赖于fork()
不带exec()
。因此,我正在考虑某种内核级别的操作,其中内核为正在转储的进程的进程页表创建写时复制快照,然后在原始进程继续运行的同时将内核写出。
我敢肯定,我可以gdb
强迫fork()
父母抛弃孩子,然后wait()
让父母快乐地继续生活,然后在父母解雇后再让孩子收割。但是,这很麻烦,尽管短暂,但仍需要中断父进程两次。
肯定有人需要吗?
很抱歉,我只能对这个绝妙的问题只作一个表决。
—
彼得说恢复莫妮卡2014年
一个非常好的问题,我很期待这个答案。从我+1
—
thanasisk
怎么样1)用gdb附加进程2)让它通过“调用fork”命令分叉3)转储子进程的核心4)让已死亡的孩子由父级等待(另一个“调用wait4”)5 )从过程中分离出来6)自动化1-5吗?Gdb使用简单的sys_ptrace()系统调用,它可能是一个完全独立于gdb的不太复杂的C工具。
—
彼得说恢复莫妮卡2014年
在虚拟机上,您可以拍摄快照并将其作为克隆进行分析。也许这里列出的工具之一可以为您提供帮助:cyberciti.biz/programming/linux-memory-forensics-analysis-tools
—
Giovanni Tirloni 2014年
您可以通过使子进程也分叉然后退出来避免第二次中断。然后,父进程可以立即等待孩子,然后继续,而祖父母转储核心。
—
kasperd 2014年