据此, int 3从用户空间使用它来生成 SIGTRAP。
但是,在用户空间下的特权下应该做什么呢?
还有更多的东西可以从用户空间 SIGTRAP 生成这样的东西吗?
mev*_*ets 11
操作码int 3不知道任何 UNIX 约定,例如 SIGTRAP。Int 3 生成一个异常,该异常通过索引 3 进行向量化。通常将其视为调试异常,实际上调试寄存器也会通过同一索引生成异常。
Int 3 有点特殊,因为它是单字节操作码;与其他需要 2 的 int $n 指令不同。因为它是单个字节,所以可以通过用它重写现有操作码的第一个字节来在程序中放置断点。虽然从技术上讲,您可以使用多字节操作码来执行此操作,但程序文本中的下一个字节可能是您可能会损坏的重要数据或跳转标签。
按照惯例,当遇到此操作码时,unix 派生操作系统将发出信号 (SIGTRAP);这为调试器(或内核中的调试模块)提供了查找违规地址的机会,以查看它之前是否在此地址设置了断点(或观察点)。如果是这样,它将执行通常的调试器工作。如果不是,它可能会将 SIGTRAP 传播到违规进程。
在特权(内核)代码中遇到断点的情况下,处理没有太大不同,但会期望内核调试器处于活动状态,并且它将遵循与上面类似的处理,除了没有结果挂起的断点可能会在控制台上显示一堆有趣的数字来停止系统。