程序动画(在调试器中逐步/单步执行)是如何实现的? (例如在 VSC++ 中)

Posted

技术标签:

【中文标题】程序动画(在调试器中逐步/单步执行)是如何实现的? (例如在 VSC++ 中)【英文标题】:How is program animation (step by step/single step execution in a debugger) implemented ? (for example in VSC++) 【发布时间】:2014-01-23 06:00:15 【问题描述】:

我最近研究了用于调试器实现的 Windows API 函数。 现在我知道了如何基本调试程序并读取程序内存。

我还发现了处理某些“调试事件”的函数,例如断点(据我了解,它是函数调用,被植入到要由编译器调试的程序中)。

但是我没有看到任何可以使调试器单步执行程序的功能(无论是逐条指令还是逐行)。

我对此非常好奇,任何帮助将不胜感激!

提前谢谢你!

拉斐尔

【问题讨论】:

1.在下一个逻辑行创建断点。 2. 恢复执行。 3.删除断点。 这将需要调试器在每条指令之后更改程序代码(内存中的图像)。我正在寻找可能告诉操作系统或处理器在每条指令之后抛出异常或中断的东西。 【参考方案1】:

x86 有TF,跟踪标志。在这种模式下,每条指令都会生成一个INT 1。这意味着您不必不断调整硬件断点寄存器。

【讨论】:

【参考方案2】:

x86 处理器具有所谓的硬件断点。基本上,您可以设置特定的寄存器。当程序计数器达到存储在寄存器中的值时,程序被中断并将控制权交给调试器。请参阅此简要说明以获得更好的理解。 http://en.wikipedia.org/wiki/X86_debug_register

【讨论】:

+1 所有重要的处理器都具有此功能。缓存/流水线/多核/等意味着纯软件断点是不可行的。 @MartinJames - 嗯,谢谢。我以前不知道,但由于你提到的原因,它是完全有道理的。我什至不想想象在这样的环境中尝试在所有地方插入 INT3(或等效)的地狱。 o_O 谢谢!这就是我一直在寻找的。​​span>

以上是关于程序动画(在调试器中逐步/单步执行)是如何实现的? (例如在 VSC++ 中)的主要内容,如果未能解决你的问题,请参考以下文章

Parallel.ForEach 调试或单步执行

c语言中啥叫做单步调试,步骤是啥???

如何在 Visual Studio 或 CLion 调试器中单步执行 ispc 源文件?

Python如何实现单步调试

Pycharm中实现单步跟踪

VScode如何逐步运行调试javaScript?