2014-09-22 44 views
29

当我点击n来评估一条线时,我想返回,然后在s失败时点击s进入该功能。这可能吗?可以在pdb后退吗?

文档说:

Ĵ(UMP)LINENO 设置将要执行的下一行。仅在最底部的框架中可用。这可以让您跳回来并再次执行代码,或者跳转到跳过您不想运行的代码。

+4

没有。 PDB无法让时间倒转。 – 2014-09-22 11:26:54

+0

@MartijnPieters看到我的编辑,文档说你可以跳回到一行,所以不可能做到这一点或以某种方式跳回到前一行? – YPCrumble 2014-09-22 11:28:32

+0

跳回到失败的函数并恢复导致失败的状态是两回事。 – 2014-09-22 11:29:52

回答

22

GNU调试器gdb:它非常慢,因为它一次解除单个机器指令。

Python调试器pdb:jump命令在代码中向后引导您,但不会反转程序的状态。

对于Python,扩展的python调试器原型epdb是由于这个原因而创建的。这里是thesis,这里是program and the code

我用epdb作为起点创建一个实时反向调试器作为我的硕士学位的一部分。论文可在线获取:Combining reverse debugging and live programming towards visual thinking in computer programming。在第1章和第2章中,我还介绍了大多数反向调试的历史方法。

+0

论文看起来非常好!我没有详细阅读,但是作为专家,您认为迄今为止在这个问题上提到的解决方案如何?你的epdb vs [timetravelpdb](https://github.com/TomOnTime/timetravelpdb)与[pypy中的revdb](https://morepypy.blogspot.com.au/2016/07/reverse-debugging-for-python。 HTML)? – ShreevatsaR 2017-04-27 08:50:49

+1

@ShreevatsaR不知道你指的是哪一篇论文,帕特里克萨宾的早期epdb论文,或者我后来的论文,都与上面有关。没有遵循反向调试开发超过2年,所以不确定。快速浏览之后:timetravelpdb看起来与epdb非常相似,但功能较少,例如epdb不仅管理程序状态,还管理外部/环境状态(某种程度上),以确保确定性。 Revdb使用记录重放方法,似乎也不管理外部状态。正如我的论文所解释的,记录重播和快照(我的偏好)方法都有优点。 – Abraham 2017-05-01 20:12:43

+0

谢谢!这很有帮助。 – ShreevatsaR 2017-05-01 21:11:43

9

反向调试(返回到以前记录的应用程序状态或向后单步调试)通常是程序集或C级调试器功能。例如。 GDB可以做到这一点:

https://sourceware.org/gdb/wiki/ReverseDebug

Bidirectional (or reverse) debugging

Reverse debugging is utterly complex, and may have performance penalty of 50.000x。它还需要调试工具的广泛支持。 Python虚拟机不提供反向调试支持。

如果您是交互式评估Python代码,我建议尝试IPython Notebook,它们提供基于HTML的交互式Python shell。您可以轻松编写代码并混合并匹配订单。虽然没有pdb调试支持。有ipdb为输入的调试命令提供了更好的历史记录和搜索功能,但是据我所知,它并不直接向后跳转。

6

PyPy已经开始执行RevDB,它支持反向调试。

它是(截至2017年2月)仍处于alpha阶段,仅支持Python 2.7,仅适用于Linux或OS X,并且需要您自己从特殊版本创建Python。它也很慢,并使用大量的RAM。引用Bitbucket页面:

请注意,日志文件通常以每秒1-2 MB的速率增长。假设尺寸不是问题,限制因素是:

  • 重播时间。如果您录制的执行时间超过几分钟,重播将会非常缓慢。它有时需要在一次会话中多次遍历整个日志。如果该错误是随机发生的,但很少发生,则应该运行几分钟的录制,然后重复该过程并再次尝试,直到发生崩溃。
  • 重放的RAM使用情况。 RAM的要求比播放要大10到15倍。如果这太多了,你可以尝试在_revdb/process.py中使用MAX_SUBPROCESSES的较低值,但它总是会大几倍。

细节都在PyPy blog以及安装和使用说明都在RevDB bitbucket page

相关问题