“时间旅行调试器”的原理是什么?

8
嗯...我的老师、一些同学和我打算开发一个调试器项目。我们希望我们的调试器是交互式的,也就是说,当代码被输入后,几秒钟后结果将显示在某个地方,并且随着输入代码的更改而更改。另一方面,在运行时,我们可以回滚到以前的行或断点。
根据我的老师的话,编程时会涉及到“时间旅行调试”技术。我找了一些其他人维护的项目,但我很难理解代码,而且这些README文件中都没有关于这种技术的介绍。
参考资料: https://github.com/mattgodbolt/compiler-explorer

5
您的老师或许是《神秘博士》的粉丝吗?“时空编译”并不是一个通用术语,这似乎是他们自创的短语。您可以询问他们这个短语的含义。 - John Coleman
这是关于能够在调试器中设置断点,然后向步进执行语句以查看断点之前运行时环境状态的内容。 - Pointy
@GermánDiago 目前,“时间旅行编译”这个短语只有5个谷歌搜索结果,其中3个是由于这个问题而产生的,因此从这个意义上讲,它确实不是一个标准术语。很难想象那些只有如此之少搜索结果的自然听起来的三个单词的短语。 - John Coleman
1
感兴趣的内容:OCaml - 调试器(ocamldebug) OCaml 还拥有时间旅行调试功能。 - Guy Coder
1
感兴趣的内容:Visual Studio IntelliTrace - Guy Coder
显示剩余2条评论
2个回答

11
这通常被称为“时间旅行调试”,通常与“函数响应式编程”相关联(这些术语您可以轻松搜索)。Elm Language博客上有一些相对易懂的文档(例如time travel made easy),但我建议您从头开始而不是跳入中间并需要时间旅行来理解(有点双关意味:-))。
严格来说,时间旅行调试是在运行时发生的事情,但如果您使用函数式语言(例如Haskell、Elm、OCAML或其他已实现时间旅行调试器的语言),编译这些语言(是的,它们被编译了)涉及一些有趣的概念,会更容易些。
Elm编译成JavaScript,这使得尝试变得相对容易。
祝您在项目中玩得开心。

据我所知,它可以与所有纯函数式编程一起使用,为什么您要将其限制为仅功能反应? - Guy Coder
@Guy:我并不是这个意思。实际上,它也可以与非函数式编程一起使用。有一个针对JavaScript的时间旅行调试器,而JavaScript显然不是函数式编程语言。我的意思是说,它常常与FRP相关联,而FRP旨在为OP提供搜索更多信息的一些指导。在第二段中,我将OCAML添加到了函数式语言列表中。 - rici
你可能还想提到 Visual Studio IntelliTrace - Guy Coder
@GuyCoder:除非有关于VS IntelliTrace实现策略的参考,否则我不认为它的存在对那些试图构建这样一个项目的人有什么帮助。我想它的存在是有趣的,但许多类似的东西都存在,并且其中一些有关于它们设计方式的可访问信息。 - rici

4

时间旅行调试,也称为反向调试。简单来说,您可以一遍又一遍地调试相同的代码行(无需停止/重新启动应用程序)。

例如,您正在调试一个方法,在第10行抛出了异常,为了找到异常的原因,您可以从之前的某个点(比如第4行)再次执行该方法,而无需重新启动整个调试过程。这一切都是实时的,非常高效。

我曾在Visual Studio中使用过此功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接