首页 > 解决方案 > tct 命令在后台是如何工作的?

问题描述

windbg 命令tct执行一个程序,直到它到达一条call指令或一条ret指令。我想知道调试器如何在后台实现此功能。

我可以想象调试器会扫描当前指令中的指令以获取下一条callret并根据找到的指令设置断点。但是,我认为这不太可能,因为它还必须考虑jmp指令,以便有任意数量的可能指令callret指令必须设置这样的断点。

另一方面,我想知道 x86/x64 CPU 是否提供了一种功能,该功能会在 CPU 即将处理callret指令时引发异常以被调试器捕获。然而,我还没有听说过这样的功能。

标签: debuggingx86-64windbg

解决方案


我猜它会重复单步,直到下一条指令是调用或 ret,而不是试图找出在哪里设置断点。(在一般情况下,这可能与解决停机问题一样困难。)

它有可能通过向前扫描“直线”代码并在下一条//或其他控制转移指令(例如)上设置断点jmpjccloop捕获xabort可以将控制转移到 SEH 处理程序的信号/异常来优化它。

我也不知道有任何硬件支持中断某种类型的指令或操作码:x86 调试寄存器 DR0..7允许在代码地址处设置硬件断点,而无需将机器代码重写为int3,以及硬件观察点(以捕获数据加载/store 到特定地址或地址范围)。但不按操作码过滤。


推荐阅读