我的理解是gdb可以监视正在运行的程序的完整状态。我可以保存在断点处暂停的gdb会话并在以后恢复该会话吗?
我的第一次尝试只是在第一个gdb会话中生成了一个核心转储,该会话在断点处暂停,然后使用该核心转储来启动第二个gdb会话。
这导致以下错误。
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
Run Code Online (Sandbox Code Playgroud)
因此,将断点信息插入程序状态,很有趣。在第二次尝试中,我执行了相同的操作,但是这次我在第二次会话中添加了与第一次会话相同的断点。
仍然,我得到同样的错误。
我可以保存并重新启动gdb会话吗?如果是这样,怎么办?
我认为这并不直接相关,但我也收到了此警告。
warning: core file may not match specified executable file.
Run Code Online (Sandbox Code Playgroud)
是gdb只是简单地声明这种事情通常是可能的,还是gdb认为这可能是在运行的会话中发生的?我相信,生成核心转储的同一可执行文件正在gdb下运行。
编辑:对于其他人,这个问题:保存进程的内存以供以后使用?添加到Mats Petersson的答案和指向本文的链接:http : //blogs.msdn.com/b/oldnewthing/archive/2004/04/20/116749.aspx,这是一本有趣的文章。链接的问题还建议将进程包装在VM中。
我怀疑这是否会奏效。当您保存核心文件时,程序打开/创建的文件和任何其他资源(信号量、共享内存、串行端口、网络连接和许多其他资源)的句柄将丢失。您可以检查它,但不能“继续”。核心文件只是原始程序使用的所有内存的副本。当程序终止时,其他任何东西都会“丢失”。换句话说,核心文件仅对稍后检查有用,但您无法在核心文件调试会话中运行、单步执行或继续。只能“看事物”。如果你无法执行,断点也不会真正起作用......;)