当您谈论解释程序时,调试器非常有意义,因为指令总是在执行前通过解释器进行验证。但是,编译应用程序的调试器如何工作?如果指令已在内存中运行并运行,如何通知已达到“断点”或发生“异常”?
答案 0 :(得分:2)
借助硬件和/或操作系统。
大多数现代CPU都有几个调试寄存器,可以设置为在达到某个地址时触发CPU异常。它们通常还支持地址观察点,当应用程序读取或写入指定的地址或地址范围时触发异常,并且单步执行,这会导致进程执行单个指令并抛出异常。附加到程序的调试器可以捕获这些异常(见下文)。
或者,一些调试器通过使用中断或陷阱指令临时替换断点处的指令来创建断点(从而也导致程序引发CPU异常)。一旦命中断点,调试器就会用原始指令替换它,并使CPU超过该指令单步执行,以使程序正常运行。
就异常而言,这取决于您正在进行的系统。在UNIX系统上,调试器通常使用ptrace()
系统调用来附加到进程并获得处理其信号的第一个镜头。
TL; DR - 低级魔法。