有时我会在代码的不同位置积累大量来自不同调试会话的断点。调试器如何有效地知道何时停止断点?它不可能在每一行都停下来检查行号和源文件名与可能很长的断点列表,可以吗?
这是 Eclipse 中的 Java 调试器,但我认为这个问题适用于任何调试器。
有时我会在代码的不同位置积累大量来自不同调试会话的断点。调试器如何有效地知道何时停止断点?它不可能在每一行都停下来检查行号和源文件名与可能很长的断点列表,可以吗?
这是 Eclipse 中的 Java 调试器,但我认为这个问题适用于任何调试器。
许多调试器(我不了解 Eclipse)中使用的策略是在断点处将补丁放入代码中,这本质上是子程序调用或系统调用。跳转到的代码有断点信息,做任何打印或接受用户命令,也有被补丁覆盖的代码,这样可以执行代码,使执行与原始代码匹配,没有断点
添加到纳德雷克的好答案:
这里有一篇文章,其中包含更多细节,包括一些更奇特的东西(x86 上的特定操作码;硬件断点)。
调试器在硬件或软件中实现断点。后者需要保存原始指令,插入生成异常的特殊代码,当引发异常时,重新插入原始指令并让用户知道断点已被命中。阅读我的文章,了解有关软件断点的详细信息。
您可以在下面的链接中获取 Eclipse 调试器的完整详细信息以及如何 编写一个 Eclipse 调试器