向后调试

时间:2008-10-21 13:07:36

标签: debugging

我有两个问题:

  1. 在进行源代码级调试(使用任何调试器)时,任何调试器都会保存某些迭代/ for-loop /执行的任何代码的状态,并允许用户稍后返回先前执行的代码/数据状态调试时的时间点? 需要这个是一些变量/指针在执行期间的某个时间早些时候被破坏但是在执行代码之后的某个时间/之后被访问,那就是当它崩溃/挂起代码时,所以我想回去看看哪个函数/在什么时候变量被破坏/错误的值计算并写入它?是否可以在任何调试器(gcc,MSVC6.0 ......)

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

  4. -AD

11 个答案:

答案 0 :(得分:10)

听起来很像你想要获取Visual Studio 2010的副本。

他们几乎完全实现了您在#1中所描述的内容 - 在Channel 9上的Visual Studio Team System 2010中有一个关于新“The Historical Debugger”的截屏视频。

here (this one is for the April 2008 CTP of codename 'Rosario')

这个条目中有更多关于它的内容

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

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

这是另一个video walkthrough

编辑:我开始评估Visual Studio 2010中最(1) recent CTP次删除(31/10 - 10月08日),他们似乎已经实现了历史调试器的早期版本。可能值得一试。

(1)[http://www.microsoft.com/downloads/details.aspx?FamilyId=922B4655-93D0-4476-BDA4-94CF5F8D4814&displaylang=en]

答案 1 :(得分:4)

我认为你正试图进入Omniscient DebuggerTangible Program Histories(从1999年开始!!)。

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

答案 2 :(得分:3)

对于#2,您可能希望阅读gdb中可用的watchpoints以及其他调试器。

  

观察点类似于   断点。但是,观察点是   没有为函数或行设置   码。观察点已设置   变量。当那些变量是   读或写,观察点是   触发和程序执行停止。

答案 3 :(得分:2)

我不知道任何调试器可以让你保存状态以便以后再返回它。调试器无法知道哪些状态是相关的。你可以得到的最接近的是在某个时刻创建一个转储文件,这可以让你稍后检查整个程序状态。

Visual Studio支持data breakpoints,只要写入给定的内存位置,它就会进入调试器。

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

答案 4 :(得分:2)

您可能希望从VMware查看Replay Debugging

从链接:

  

我们所做的是将Workstation的Visual Studio插件与Record / Replay技术集成。您现在可以使用Visual Studio开发应用程序,然后只需点击几下鼠标即可在录制模式下在VM中启动它。然后,您可以使用Visual Studio提供的所有调试工具,根据需要多次重放录制。

     

但我们并没有因此而停止。我们也   实施独特的“反向执行”   特征。比如说,如果你正在调试一个   内存损坏,你可以把   对损坏的记忆和观察的观察   然后点击Visual中的“Reverse Continue”   Studio插件菜单 - 我们会   将录制内容导航到   上次写入内存的地方   到。

答案 5 :(得分:2)

自2009年9月以来,GNU调试器(gdb)可以反向调试,即能够使程序被调试步骤并继续反向调试。这听起来就像你要求的那样。

详情请见此处:http://sourceware.org/gdb/news/reversible.html

答案 6 :(得分:1)

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

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

您可以设置条件断点,以便在i == 17foo == null时停止。

答案 7 :(得分:1)

这样的调试器正在制作中。您可以查看以下Google Talk - Debugging Backwards in Time

答案 8 :(得分:1)

第一期: ddd / gdb有一个backtrace,它可以准确显示它到达那一点的方式。 coredump也可能有所帮助。

有关可能的副作用的有趣文章是this one

答案 9 :(得分:0)

我相信OCaml的最新版本有这个。这似乎是一个新的时尚,但IIRC这是未来版本的Visual Studio的愿望清单。

VS中的一个功能我没有使用,可以跟踪对象(使对象id或其他东西)。

答案 10 :(得分:0)

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

这只适用于在单个函数中跳转,但它可以用于“尝试再次”使用不同的值 - 在循环后中断,使用调试器更改变量值,然后跳回到循环的顶部。或者,如果你知道一个函数调用会失败但你想看看之后会发生什么(例如......因为你在调试器中被停止而超时的东西,但你想继续执行就像它没有' t超时),您可以使用“将执行点移动到此处”功能来跳过该代码。

我知道这不是你要求的,但目前,我们只有......我相信这种技术可能很快就会上市,但目前我认为它处于“研究”阶段。