Debugging 向后调试

Debugging 向后调试,debugging,Debugging,我有两个问题: 在执行源代码级调试(使用任何调试器)时,是否有任何调试器保存某些迭代/for loop/任何已执行代码的状态,并允许用户在调试期间的稍后时间返回到先前执行的代码/数据状态? 需要这样做的是,一些变量/指针在执行过程中较早的某个时间被损坏,但在执行代码的一段时间/之后被访问,这就是它崩溃/挂起代码的时候,所以我想返回并查看哪个函数/变量在什么时候被损坏/计算并写入错误的值?在任何调试器(gcc、MSVC6.0…)中都可以吗 是否有任何调试器/IDE规定,当一个内存地址/变量被标记为

我有两个问题:

  • 在执行源代码级调试(使用任何调试器)时,是否有任何调试器保存某些迭代/for loop/任何已执行代码的状态,并允许用户在调试期间的稍后时间返回到先前执行的代码/数据状态? 需要这样做的是,一些变量/指针在执行过程中较早的某个时间被损坏,但在执行代码的一段时间/之后被访问,这就是它崩溃/挂起代码的时候,所以我想返回并查看哪个函数/变量在什么时候被损坏/计算并写入错误的值?在任何调试器(gcc、MSVC6.0…)中都可以吗

  • 是否有任何调试器/IDE规定,当一个内存地址/变量被标记为“分析”时,它应该在每次更改/写入时显示哪个文件中的哪个函数,以及哪个代码更改了该内存(写入)


  • -AD

    我相信最新版本的OCaml具有这一点。这似乎是一种新的时尚,但IIRC这是未来版本的visualstudio的愿望清单


    VS中的一项功能我没有使用过,它可以跟踪对象(生成对象id或其他内容)。

    我不知道有任何调试器允许您保存状态以便以后返回。调试器无法知道什么状态是相关的。最接近的方法是在某个时候创建一个转储文件,这将允许您稍后检查整个程序状态

    VisualStudio确实支持在写入给定内存位置时将中断到调试器

    这些对于找出正在被破坏的内存块上的内容非常有用。但是,您可以设置的数据断点数量存在限制,因为它们是使用处理器的硬件寄存器支持实现的。

    对于#2,您可能需要阅读gdb中提供的其他调试器

    观察点类似于 断点。然而,观察点是 未为函数或函数行设置 代码。监视点设置为on 变量。当这些变量 读或写,观察点是 触发并停止程序执行


    对于第一点,您可以尝试使用条件断点。我用过的大多数调试器似乎都有这个功能,尽管很多人不知道。您可以将断点设置为仅在满足某些条件时停止,例如迭代器变量为某个数字,或者其他变量为null。例如:

    for (i = 0; i < list.size(); i++) {
      foo = list[i];
    }
    
    for(i=0;i

    您可以设置一个条件断点,在
    i==17
    foo==null

    这类调试器正在生成时停止。对于第一期,您可以查看以下内容: ddd/gdb有一个简单的例子,它向您展示了它是如何达到这一点的。 此外,coredump可能会有所帮助


    一篇关于一种可能的副作用的有趣文章是

    听起来你很想买一本VisualStudio2010

    他们几乎完全实现了您在#1中描述的内容-在2010年的Visual Studio Team System中有一个关于新“历史调试器”的屏幕广播

    在这个条目中有更多关于它的信息

    我在Maor David()的博客中找到了新历史调试器的定义:

    “Visual Studio历史调试器捕获并记录应用程序在运行时所做的操作。发生错误时,通过调查历史调试器记录的信息,可以快速找到根本原因。在调试过程中的任何时候,您都可以在时间上前后移动以确定错误发生的位置。”

    这里还有一个

    编辑:我开始评估VisualStudio2010的最大降幅(31/10-08年10月),他们似乎实现了历史调试器的早期版本。这可能值得一看


    (1) [

    我想你是在试图进入手术室(从1999年开始!!)

    当然,这些是更多的研究论文/实现,但这些概念似乎最终进入了主流编译器。

    您可能想看看VMware

    从链接:

    我们所做的是将Visual Studio plugin for Workstation与录制/重播技术集成在一起。您现在可以使用Visual Studio开发应用程序,然后只需单击几下鼠标,即可在录制模式下在虚拟机中启动应用程序。然后,您可以使用Visual Studio提供的所有调试功能,任意多次重播录制

    但我们并没有就此止步,我们也 实现了唯一的“反向执行” 功能。例如,如果您正在调试 内存损坏,您可以将 损坏内存上的监视点和 然后在Visual Studio中单击“反向继续” Studio插件菜单-我们将 将录制右键导航到 上次写入内存的位置 对


    虽然当前的调试器不保存状态,但在某种程度上允许您返回。您可以使用“将执行点移到此处”功能(当然,实际名称将取决于调试器)设置正在执行的行

    这只适用于在单个函数中跳转,但对于“重试”可能很有用“使用不同的值-在循环后中断,使用调试器更改变量值,然后跳回循环的顶部。或者,如果您知道函数调用将失败,但希望查看之后会发生什么情况(例如,由于您在调试器中被停止,但您希望继续执行,就好像它没有超时一样),您可以使用“将执行点移到此处”功能跳过该代码

    我知道这不是你想要的,但就目前而言,这是我们所有的……我相信这样的技术可能很快就会出现,但对我们来说