【问题标题】:How does the tct command work under the hood?tct 命令在后台是如何工作的?
【发布时间】:2021-03-27 19:58:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: debugging x86-64 windbg


    【解决方案1】:

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

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

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

    【讨论】:

    • IA32_DEBUGCTL MSR 中的 BTF 控制会导致每条控制传输指令出现单步中断。
    • @prl:哦,太好了,听起来它就是为这种目的而设计的,在单步执行的同时加速直线代码。 xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/… 从 vol.3 中提取一个描述它的页面。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多