Java 调试器 (JDB)。
最重要的是 JDB 可以免费获取并且是平台独立的。其缺点是它只有命令行格式,一些开发人员认为这很原始,而且难以使用。一些 IDE 已经将 GUI 界面构建到 JDB 调试 API(如 Jikes)。JDB 是 JDK 安装的一部分。它在 Java 2 平台中得到了增强。
现有的所有调试器都可分为两大类。第一类调试器利用处理器提供的调试工具,而第二类调试器自行仿真处理器并完全控制所调试程序的执行过程。
程序是既不能检测到也不能绕过高质量仿真调试器的。可是,在本书写作时还不存在功能完备的针对奔腾处理器的仿真器,而且也不太可能会很快出现。
但是,是否有必要开发这类仿真调试器呢?奔腾处理器提供了一系列的控制功能,它们甚至可以控制特许操作代码!它们支持单步执行程序,捕获位于指定地址的指令执行,并提供对指定的内存单元(或者输入/输出端口)的访问,以及任务切换等功能。
如果标志寄存器的追踪位被置位,那么执行每一条机器指令后都会产生调试中断INT 1,并将控制传给调试器。通过分析标志寄存器,被调试的代码能够检测到追踪。因此,为了保证其操作不被发现,调试器必须识别读取标志寄存器的指令,并通过返回值为零的追踪位来仿真其执行结果。
必须注意如下的一种重要情形:在执行了修改SS寄存器的指令之后,并不会引发调试异常。调试器必须知道如何识别这种情形,并自行在下一条指令上设置断点。否则,追踪者就不能进入指令POP SS后面的过程(例如:PUSH SS; POP SS; CALL MySecrectProc)。并不是所有的当代调试器都具有这一功能的,因此,虽然这一点已被发现了很长时间,但这种技巧可能依然有效。
有四个调试寄存器(即DR0~DR3),它们用于存放四个断点的线性地址,而控制寄存器DR7包含了这四个断点中的每一个的控制条件。当满足该条件时,处理器产生INT 0x1异常并将控制传给调试器。总共有四个中断的条件:当执行指令时发生中断,如果内存单元被修改则发生中断,当读取或者修改但不执行内存单元时发生中断,以及当访问输入/输出端口时发生中断。
通过设置特定的数据位,就可以在调试寄存器被访问的任何时间引发调试异常。即使是特许执行代码试图读取(或者修改)这些寄存器时,也会引发调试异常。无论被调试的代码有怎样的执行特权,设计精良的调试器都能够隐藏自己的行迹而不让被调试的代码发现自己(虽然如果操作代码调试自己,那么调试器不能使用全部的四个断点)。
如果任务的任务状态段(TSS)的T位被置位,那么每当切换到该任务时,在执行该任务的第一条指令之前,都会引发调试异常。为了防止正被调试的代码发现调试器的存在,调试器应该追踪访问其TSS的所有操作,并把虚构的数据返回程序。必须注意:基于性能的考虑,Windows NT并不使用TSS(或者更精确地说,在一个硬件任务的所有运行时间内,它都只使用一个TSS),因此在这种情形中,调试可能是无效的。
软件断点是惟一的一种不编写功能完整的处理器仿真器就不能被隐藏的对象。它表示为一个字节的代码0xCC,放在指令之前,当出现任何企图执行它的操作时都将引发INT 0x3异常。对于被调试的程序,计算求和校验位就足以发现是否至少设置了一个断点。可以使用诸如MOV,MOVS,LOAS,POP,CMP或者CMPS之类的指令来实现这一点,因为没有一种调试器能够追踪和仿真全部的这类指令。
我们强烈地建议,只有在硬件断点不满足需要时,才使用软件断点。然而,实际上,所有的当代调试器(包括SoftIce)都默认地设置软件断点而不是硬件断点。这一事实可以成功地用于保护机制。
所有高级语言都是基于汇编语言的,汇编语言的debug调试命令中有T命令,就是跟踪执行命令,也许JAVA也是由此来的吧。
====================
我通俗一点讲一下吧
在编译后机器直接执行的语言(比如C)中
调试靠的是系统的中断信号来实现的(也就是这是硬件的一个功能),可以设置cpu使用单句执行来一步步执行,每次执行完了会发送一个中断信号给指定的程序(类似java的事件回调机制)
Java的解释器,也使用获取中断信号的方式,如果你用debug模式执行,那么他会单步执行,到断点的时候就会暂停,原理是一样的
分享到:
相关推荐
《Visual Studio Code的Java调试器深度解析》 Visual Studio Code(VS Code)作为一款轻量级但功能强大的源代码编辑器,已经成为了许多开发者的选择,尤其是对于Java开发来说,其集成的Java调试器更是提升了开发...
Java调试是开发者日常工作中不可或缺的一部分,它涉及到对代码的深入理解和问题排查能力。在Java编程过程中,遇到程序出错或运行异常时,调试是找出问题源头的关键步骤。本文将详细介绍Java调试的一些核心技术和方法...
"Java Script 调试器"就是这样一个工具,专为开发者提供对JavaScript代码的调试支持。 调试器的主要功能包括: 1. **断点设置**:在代码的特定行设置断点,当执行到这一行时,程序会暂停,允许开发者检查当前的...
《深入理解Java与.NET平台下的正则表达式调试器》 正则表达式,作为一种强大的文本处理工具,广泛应用于各种编程语言中,包括Java和.NET Framework。然而,编写复杂的正则表达式时,往往需要反复调试才能确保其正确...
Java调试体系及协议是开发和优化Java应用程序的关键组成部分。它为开发者提供了深入理解代码执行流程、定位和修复问题的能力。本文将深入探讨Java Platform Debugger Architecture (JPDA),这是Java调试的基础,以及...
vscode-java-debug 是一个专为VSCode设计的Java调试器插件,它提供了强大的Java应用调试功能,使得在VSCode中编写、运行和调试Java代码变得更加便捷。 【知识点详细说明】 1. **Visual Studio Code (VSCode)** - ...
《Visual Studio代码中的Java调试器:深度探索与实践》 Visual Studio Code,简称VS Code,是微软开发的一款轻量级且强大的源代码编辑器,支持多种编程语言,包括Java。这款编辑器以其丰富的扩展功能和高效的开发...
本项目是基于Java实现的一个正则表达式调试器,通过NetBeans集成开发环境进行开发,旨在帮助开发者更好地理解和测试正则表达式。 在Java中,正则表达式的操作主要依赖于`java.util.regex`包中的几个类,如`Pattern`...
Java JavaScript 引擎调试JS代码是一项关键技能,特别是在开发混合型应用或利用Java与JavaScript进行交互的场景下。本文将深入探讨如何使用Nashorn JavaScript引擎进行JS代码的调试。 Nashorn是Java 8引入的一个...
Java UDP调试工具是一种用于测试和调试UDP(User Datagram Protocol)网络通信的应用程序。UDP是一种无连接的传输协议,常用于需要高效传输且对数据完整性要求不高的场景,如在线视频流、实时游戏等。该工具通常包含...
【标题】:“vscode-java-debug”是一个专门为Visual Studio Code(VSCode)开发的Java调试扩展,使得开发者在使用VSCode时能够便捷地进行Java程序的调试工作。 【描述】:这个扩展是开源项目,意味着其源代码对...
- **附加调试器**:在Eclipse中选择要调试的项目,然后依次点击`Debug As` -> `Debug Configurations`。 - **创建远程调试配置**:选择`Remote Java Application`,并设置目标IP地址和端口号(例如9999)。 - **连接...
通过合理设置Java调试参数,开发者可以在开发、测试甚至生产环境中对Java应用程序进行远程调试,这对于定位问题、理解程序运行时的行为至关重要。本文将围绕“Java调试参数”这一主题展开,详细介绍与之相关的各项...
- **Axis2**:Apache Axis2是一个强大的Web Service框架,它包含了一个内置的调试器,允许开发者调试服务端和客户端的代码。它也支持WSDL第一的开发模式,可以直接从WSDL生成服务。 - **SOAPUI**:这是一个流行的...
jdb调试器在Java课程有效教学中的应用探讨 本文探讨了如何应用jdb调试器进行Java课程相关知识的有效教学。jdb调试器是jdk软件包中一个非常有用的工具,它输出的调试信息比现有的图形用户界面式的集成化开发工具更...
比纯调试器是一款强大的编程工具,它支持多种编程语言,如Windows环境下的VC6到VC2019、JAVA、C#(2005至2019)及WDK驱动,Android平台上的Java和C/C++,Linux系统中的gcc/g++、Java以及模块驱动,还有BSD/UNIX系统...
Java串口模拟调试是开发和测试嵌入式系统、物联网(IoT)设备或任何依赖串行通信的硬件时的一项重要技能。VSPD(Virtual Serial Port Driver)是一款实用工具,它允许用户在没有实际物理串口的情况下进行串口通信的...