与软断点不同的是,硬件断点使用 1 号中断(INT1)实现,INT1 一般被用于硬件断点和单步事件。 CPU 每次试图执行一条指令时,都会首先检查当前指令所在地址是否被设置了有效的硬件断点,除此之外还会检查当前指令包含的操作数是否位于被设置了硬件断点的内存地址。 3.3 内存断点 内存断点本质上不是一个真正的断点。当调试...
DR7 是硬件断点的激活开关,存储着各个断点的触发信息条件。 与软断点不同的是,硬件断点使用 1 号中断(INT1)实现,INT1 一般被用于硬件断点和单步事件。 CPU 每次试图执行一条指令时,都会首先检查当前指令所在地址是否被设置了有效的硬件断点,除此之外还会检查当前指令包含的操作数是否位于被设置了硬件断点的内存地址。
检测软件断点,一般来说靠内存校验(crc、关键点监视)判断有没有哪行指令被修改成了断点。 检测硬件断点,通常来说是通过相关api或主动触发异常来获得进程的一些运行信息(上下文),其中有包括硬件断点相关的内容。 检测内存断点,一般监视内存的属性是否被修改了。 详细内容的话,参见下面这个链接吧,其中包含了相关功能的实现。
我们发现执行计划中编号 8 的节点对应的 step range 明显是错的:steps: 4..3(结合语句中的 e*1..1,正确值应该是 1..1)。 下面,我们通过 rr 录下一次错误的执行过程,然后在设置 MatchStepRange 的地方(src/graph/planner/match/MatchPathPlanner.cpp:282)下断点: [New Thread 34.61] [Switching to Threa...