当您谈论解释程序时,调试器非常有意义,因为指令总是在执行前通过解释器进行验证。但是编译应用程序的调试器是如何工作的呢?如果指令已经在内存中布局并运行,如何通知我已到达“断点”或发生“异常”?
问问题
70 次
1 回答
2
在硬件和/或操作系统的帮助下。
大多数现代 CPU 都有几个调试寄存器,可以设置为在到达某个地址时触发 CPU 异常。它们通常还支持地址观察点(当应用程序读取或写入指定地址或地址范围时触发异常)和单步执行(导致进程执行单个指令并引发异常)。这些异常可以被附加到程序的调试器捕获(见下文)。
或者,一些调试器通过用中断或陷阱指令临时替换断点处的指令来创建断点(从而也导致程序引发 CPU 异常)。一旦断点被命中,调试器就会用原始指令替换它,并使 CPU 单步越过该指令,以便程序正常运行。
至于例外情况,这取决于您正在使用的系统。在 UNIX 系统上,调试器通常使用ptrace()
系统调用来附加到进程并首先处理其信号。
TL;DR - 低级魔法。
于 2013-05-22T20:10:04.937 回答