java 调试器原理

来源:百度知道 编辑:UC知道 时间:2024/06/27 12:31:07
调试器为什么能让代码“一句句”执行?根据什么技术来实现的?谢谢!
为什么可以
step into/step over/step return/step line
=====================
2008.9.28
如果我要开发一个调试器~我要怎么弄?

lz如果要开发调试器,先研究一下java vm的源码吧,sun的官网有下载的

====================

我通俗一点讲一下吧

在编译后机器直接执行的语言(比如C)中
调试靠的是系统的中断信号来实现的(也就是这是硬件的一个功能),可以设置cpu使用单句执行来一步步执行,每次执行完了会发送一个中断信号给指定的程序(类似java的事件回调机制)

Java的解释器,也使用获取中断信号的方式,如果你用debug模式执行,那么他会单步执行,到断点的时候就会暂停,原理是一样的

有什么不明白,欢迎发消息

现有的所有调试器都可分为两大类。第一类调试器利用处理器提供的调试工具,而第二类调试器自行仿真处理器并完全控制所调试程序的执行过程。

程序是既不能检测到也不能绕过高质量仿真调试器的。可是,在本书写作时还不存在功能完备的针对奔腾处理器的仿真器,而且也不太可能会很快出现。

但是,是否有必要开发这类仿真调试器呢?奔腾处理器提供了一系列的控制功能,它们甚至可以控制特许操作代码!它们支持单步执行程序,捕获位于指定地址的指令执行,并提供对指定的内存单元(或者输入/输出端口)的访问,以及任务切换等功能。

如果标志寄存器的追踪位被置位,那么执行每一条机器指令后都会产生调试中断INT 1,并将控制传给调试器。通过分析标志寄存器,被调试的代码能够检测到追踪。因此,为了保证其操作不被发现,调试器必须识别读取标志寄存器的指令,并通过返回值为零的追踪位来仿真其执行结果。

必须注意如下的一种重要情形:在执行了修改SS寄存器的指令之后,并不会引发调试异常。调试器必须知道如何识别这种情形,并自行在下一条指令上设置断点。否则,追踪者就不能进入指令POP SS后面的过程(例如:PUSH SS; POP SS; CALL MySecrectProc)。并不是所有的当代调试器都具有这一功能的,因此,虽然这一点已被发现了很长时间,但这种技巧可能依然有效。

有四个调试寄存器(即DR0~DR3),它们用于存放四个断点的线性地址,而控制寄存器DR7包含了这