debugging - 调试器/异常如何在已编译的程序上工作?

标签 debugging exception compilation cpu-architecture

当您谈论解释程序时,调试器非常有意义,因为指令在执行之前总是通过解释器进行验证。但是已编译应用程序的调试器如何工作呢?如果指令已经布置在内存中并运行,我如何通知已到达“断点”或发生“异常”?

最佳答案

借助硬件和/或操作系统。

大多数现代 CPU 都有多个调试寄存器,可以将它们设置为在到达某个地址时触发 CPU 异常。它们通常还支持地址观察点(当应用程序读取或写入指定地址或地址范围时触发异常)和单步执行(导致进程执行单个指令并引发异常)。这些异常可以由附加到程序的调试器捕获(见下文)。

或者,一些调试器通过用中断或陷阱指令临时替换断点处的指令来创建断点(从而也会导致程序引发 CPU 异常)。一旦命中断点,调试器就会用原始指令替换它,并使 CPU 单步执行该指令,以便程序正常运行。

至于异常(exception)情况,这取决于您正在使用的系统。在 UNIX 系统上,调试器通常使用 ptrace()用于附加到进程并首次处理其信号的系统调用。

TL;DR - 低级魔法。

关于debugging - 调试器/异常如何在已编译的程序上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16700638/

相关文章:

c# - VSX:在运行时以编程方式禁用断点

java - 找不到插入finally block 的位置以消除错误: Insert Finally to complete TryStatement

c++ - 使用 Dbghelp.h 的函数列表

java - PrintStream 类型中的方法 printf(String, Object...) 不适用于参数 (String, void)

parsing - 编辑时快速词法分析

c++ - 在 Code::Blocks 中调试似乎不起作用 - 缺少调试符号

.net - 如何从 ASP.NET 中的soap异常中提取内部异常?

java - 有时 IoException :Mark Invalid Jsoup Android App

Java - DateTimeFormatter - ParseException

Gradle 为运行时依赖创建循环依赖