mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-25 23:11:02 +08:00
Update 20110127 How debuggers work Part 2 - Breakpoints.md
This commit is contained in:
parent
6320408283
commit
73ac2ee3ee
@ -11,17 +11,17 @@
|
||||
|
||||
为了在 x86 架构机器上实现断点,软件中断(也被称作 陷阱)被派上用场。在我们深入细节之前,我想先大致解释一下中断和陷阱的概念。
|
||||
|
||||
一个 CPU 有一条单独的执行流,一条指令接一条的执行 [[1]][19]。为了能够处理异步的事件,如 IO 和 硬件定时器,CPU 使用了中断。一个硬件中断通常是一个特定的电子信号,并附加了一个特别的”响应电路”。该电路通知中断激活,并让 CPU 停止当前执行,保存状态,然后跳转到一个预定义的地址,也就是处理中断程序的位置。当处理程序完成其工作后,CPU 又从之前停止的地方重新恢复运行。
|
||||
一个 CPU 有一条单独的执行流,一条指令接一条的执行 [[1]][19]。为了能够处理异步的事件,如 IO 和 硬件定时器,CPU 使用了中断。一个硬件中断通常是一个特定的电子信号,并附加了一个特别的”响应电路”。该电路通知中断激活,并让 CPU 停止当前执行,保存状态,然后跳转到一个预定义的地址,也就是中断处理程序的位置。当处理程序完成其工作后,CPU 又从之前停止的地方重新恢复运行。
|
||||
|
||||
软件中断在规则上与硬件相似,但实际操作中有些不同。CPU 支持一些特殊的指令,来允许软件模拟出一个中断。当这样的一个指令被执行时,CPU 像对待一个硬件中断那样 ———— 停止正常的执行流,保存状态,然后跳转到一个处理程序。这种 ”陷阱” 使得许多现代操作系统的惊叹设计得以高效地实现(如任务调度,虚拟内存,内存保护,调试)
|
||||
软件中断在规则上与硬件相似,但实际操作中有些不同。CPU 支持一些特殊的指令,来允许软件模拟出一个中断。当这样的一个指令被执行时,CPU 像对待一个硬件中断那样 —— 停止正常的执行流,保存状态,然后跳转到一个处理程序。这种“中断”使得许多现代操作系统的惊叹设计得以高效地实现(如任务调度,虚拟内存,内存保护,调试)
|
||||
|
||||
许多编程错误(如被 0 除)也被 CPU 当做陷阱对待,常常也叫做”异常”, 这时候硬件和软件中断之间的界限就模糊了,很难说这种异常到底是硬件中断还是软件中断。但我已经偏离今天主题太远了,所以现在让我们回到断点上来。
|
||||
许多编程错误(如被 0 除)也被 CPU 当做中断对待,常常也叫做”异常”, 这时候硬件和软件中断之间的界限就模糊了,很难说这种异常到底是硬件中断还是软件中断。但我已经偏离今天主题太远了,所以现在让我们回到断点上来。
|
||||
|
||||
### int 3 理论
|
||||
|
||||
前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊陷阱,叫 int 3。int 是一个 “陷阱指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个中断。前 32 个中断为 CPU 自己保留,而 int 3 就是本文关注的 —— 它被叫做 ”trap to debugger“。
|
||||
前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊中断,叫 int 3。int 是一个 “中断指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个中断。前 32 个中断为 CPU 自己保留,而 int 3 就是本文关注的 —— 它被叫做 “调试器专用中断”。
|
||||
|
||||
避免更深的解释,我将引用“圣经”一段话[[2]][20]。
|
||||
避免更深的解释,我将引用“圣经”里一段话[[2]][20]。
|
||||
|
||||
> The INT 3 instruction generates a special one byte opcode (CC) that is intended for calling the debug exception handler. (This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code).
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
|
||||
### int 3 实践
|
||||
|
||||
没错,知道事物背后的理论非常不错,不过,这些理论到底意思是啥?我们怎样使用 int 3 部署断点?或者怎么翻译成通用的编程术语 ———— _请给我看代码!_
|
||||
没错,知道事物背后的理论非常不错,不过,这些理论到底意思是啥?我们怎样使用 int 3 部署断点?或者怎么翻译成通用的编程术语 —— _请给我看代码!_
|
||||
|
||||
实际上,实现非常简单。一旦你的程序执行了 int 3 指令,操作系统就会停止程序 [[3]][21]。在 Linux(这也是本文比较关心的地方) 上,操作系统会发送给进程一个信号 —— SIGTRAP。
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user