从核心文件恢复程序状态

Posted

技术标签:

【中文标题】从核心文件恢复程序状态【英文标题】:Restoring program state from a core file 【发布时间】:2009-12-18 20:18:27 【问题描述】:

在任何情况下都可以将程序的状态恢复到生成核心文件期间的状态吗?

我问的原因是,为了利用 gdb 执行函数等的能力,您需要有一个正在运行的实例。当然应该可以生成相同可执行文件的模拟进程,并将状态设置为核心的内容?

如果不是,对于让我一开始就想这样做的那种情况,还有什么选择?在这种情况下,核心的回溯导致了一个库函数,我想将输入复制到这个函数调用,但其中一个输入是复杂对象,可以很容易地在运行中通过函数调用将其序列化为字符串实例,但在核心转储中并非如此。

【问题讨论】:

【参考方案1】:

理论上可以完全按照您的意愿去做,但是(AFAICT)GDB(目前)不支持此功能。

最好的办法是使用GDB-7.0 并使用其嵌入的python 脚本来重新实现序列化功能。

【讨论】:

谢谢 - 不知道 python 脚本是否能够做我想做的事,但听起来还是很有用的。【参考方案2】:

这就是核心文件所做的吗?如果您使用原始可执行文件和核心文件加载 gdb

gdb myprogram.exe -c mycorefile

然后它会去到它崩溃的地方。您可以使用所有常规检查功能来查看变量、查看堆栈跟踪等。

还是我误解了你的问题?

【讨论】:

在调试核心文件时不能在 gdb 中执行函数。所以说我有一个核心文件,找到一个复杂类 Foo 的变量,我想执行 Foo.getSerialization() 来获得一个很好的简单字符串表示,因为它不是一个正在运行的进程。所以问题是可以从核心转到正在运行的进程。 您可以编写一些代码来使 gdb 打印出漂亮的值。在此处查看 Python API (sourceware.org/gdb/current/onlinedocs/gdb/…)。 @JeffFoster 我认为这真的没有帮助,如果你想调用任何实时函数,那是不可能的。【参考方案3】:

如果它对某人有用, 为此,我实现了一个 Python 模块:调用核心文件中的函数(通过模拟 CPU)。

它叫EmuCore。 我已经成功地将它用于非常复杂的函数,example 序列化 GStreamer 管道图。

请注意,它仍然有重要的限制,例如:

仅限 x64 Linux 该函数无法调用操作系统(例如读取文件) 函数参数不能是浮点数

有关详细信息,请参阅自述文件。

【讨论】:

以上是关于从核心文件恢复程序状态的主要内容,如果未能解决你的问题,请参考以下文章

JAVA语言中请写出线程从阻塞状态恢复到就绪状态的三种途径

如何以当前状态恢复现有任务

如何最好地处理核心数据+ iOS的状态恢复?

在 Java 中连接重置后恢复流式传输 GZIP 文件

从众多实体中恢复一个获取的实体——核心数据

备份和恢复 Core Data SQLite(核心数据)