debugging - tct 命令在后台是如何工作的?
问题描述
windbg 命令tct执行一个程序,直到它到达一条call
指令或一条ret
指令。我想知道调试器如何在后台实现此功能。
我可以想象调试器会扫描当前指令中的指令以获取下一条call
或ret
并根据找到的指令设置断点。但是,我认为这不太可能,因为它还必须考虑jmp
指令,以便有任意数量的可能指令call
或ret
指令必须设置这样的断点。
另一方面,我想知道 x86/x64 CPU 是否提供了一种功能,该功能会在 CPU 即将处理call
或ret
指令时引发异常以被调试器捕获。然而,我还没有听说过这样的功能。
解决方案
我猜它会重复单步,直到下一条指令是调用或 ret,而不是试图找出在哪里设置断点。(在一般情况下,这可能与解决停机问题一样困难。)
它有可能通过向前扫描“直线”代码并在下一条//或其他控制转移指令(例如)上设置断点jmp
,jcc
并loop
捕获xabort
可以将控制转移到 SEH 处理程序的信号/异常来优化它。
我也不知道有任何硬件支持中断某种类型的指令或操作码:x86 调试寄存器 DR0..7允许在代码地址处设置硬件断点,而无需将机器代码重写为int3
,以及硬件观察点(以捕获数据加载/store 到特定地址或地址范围)。但不按操作码过滤。
推荐阅读
- python - KNN Mahalanobis 错误 - V 的大小不匹配 - Python
- python - 如何解决 dtype('float32') 错误的值太大?熊猫
- javascript - 使用 Ajax 和 Django 发出 POST 请求
- linux - 在 Fedora (Linux) 中自动将屏幕截图复制到剪贴板
- amazon-web-services - 我可以将 cloudfront 与 route53 流量策略一起使用吗?
- c++ - 保存或放弃用户对对象的更改
- php - 如何从当前订单中获取 WooCommerce 订单 ID?
- php - 来自 db 的重音字符在服务器迁移后未立即显示
- python - 为什么附加到字典中的列表会产生不同的结果?
- vue.js - npm install package throws error The operation was denied by your operating system