2014-06-27 109 views
4

我的理解是,gdb可以监视正在运行的程序的完整状态。我可以保存一个在断点处暂停的gdb会话并稍后恢复会话吗?保存并重新启动暂停的gdb会话

我的第一次尝试是在第一个在断点处暂停的gdb会话中生成核心转储,然后使用核心转储启动第二个gdb会话。

Saving core file in gdb

这导致了下面的错误。

Program terminated with signal SIGTRAP, Trace/breakpoint trap. 

因此,断点信息被插入程序状态,很有意思。在我的第二次尝试中,我做了同样的事情,但是这次我在第二次会话中添加了与第一次会话相同的断点。

Getting gdb to save a list of breakpoints?

不过,我得到了同样的错误。

我可以保存并重新启动gdb会话吗?如果是这样,怎么样?

我不认为这是直接相关的,但我也得到这个警告。

warning: core file may not match specified executable file. 

gdb是简单地说这样的事情是可能的,或者gdb认为这可能发生在运行会话中吗?我相信,产生核心转储的相同可执行文件正在gdb下运行。

编辑:对于其他人来说,这个问题:Save a process' memory for later use?增加了Mats Petersson的答案和链接到这篇文章:http://blogs.msdn.com/b/oldnewthing/archive/2004/04/20/116749.aspx这是一个有趣的阅读。链接的问题也有将此过程包装在虚拟机中的建议。

回答

2

我怀疑这会永远工作。当你保存核心文件时,程序打开/创建的文件和其他资源(信号量,共享内存,串口,网络连接和许多其他事物)将会丢失。你可以检查它,但你不能“继续”。核心文件只是原始程序使用的所有内存的副本。当程序终止时,其他任何东西都会“丢失”。换句话说,一个核心文件只会在以后检查时才有用,但不能在核心文件调试会话中运行,执行或继续。只有“看事物”。如果你不能执行,断点也不会真的工作......;)

+0

外部世界确实不幸地被设计成具有很多全局变量,所以这通常不起作用。尽管如此,对于不能访问外部资源的简单程序应该是可能的。 – Praxeolitic

+0

但是,由于它不适用于大多数程序,为什么有人花时间“修复”它以便它能够运行核心文件(当然,您的程序不仅仅是计算东西 - 例如使用输出?)。 –

+0

哈,是的它确实:( 如果你可以保存和加载内存状态,你可以得到一个点,你的程序已经获得外部资源,然后反复加载/保存有问题的部分,可能不会影响这些外部资源 – Praxeolitic

相关问题