【问题标题】:Saving and restarting a paused gdb session保存并重新启动暂停的 gdb 会话
【发布时间】:2014-08-18 05:19:51
【问题描述】:

我的理解是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,这是一个有趣的阅读。链接的问题还建议将流程包装在 VM 中。

【问题讨论】:

    标签: c++ debugging gdb


    【解决方案1】:

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

    【讨论】:

    • 不幸的是,外部世界确实设计了很多全局变量,因此这通常无法正常工作。尽管如此,对于不访问外部资源的简单程序来说,它应该是可能的。
    • 但是既然它不适用于大多数程序,为什么有人会花时间“修复”它以便它可以运行核心文件(当然你的程序不仅仅是计算东西 - 因为使用输出的示例?)。
    • 哈,是的,确实如此那些外部资源。
    • 或者,您可以让程序以可重新启动的形式存储其内部状态。当不容易重现问题时,通常就是这样调试这些类型的问题......
    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2020-09-24
    • 2014-02-15
    • 2023-03-21
    • 2016-03-22
    • 2014-02-08
    • 1970-01-01
    • 2019-05-11
    相关资源
    最近更新 更多