作为java码农肯定碰到过当我们debug到一些class的时候,发现当进入到某个方法里是看不到声明的入参名,取而代之的是arg0,arg1等,继续深入更是看不到局部变量,这主要是java类编译的时候没有加-g参数导致的,而为什么我们自己在eclipse中写的代码却是可以正常跟踪呢,原因很简单,因为eclipse自行编译的时候是带-g参数编译的。
这种问题在我们安装的jdk中更为常见,为了节省生成的jar空间,于是javac编译都是不带-g参数的,比如rt.jar,里面的类都是不能被正常debug的,因为生成的class信息中没有辅助debug的信息,比如行号,局部变量信息等,那是不是我们通过手动编译jdk即可完全debug jdk中的任意java类呢,答案是否定的。
说到debug,那就要先了解下jdpa体系,jdpa包含三部分,从低到高是jvmti->jdwp->jdi,jvmti是一套本地代码接口,jvm暴露出来的扩展接口,所有的调试功能都是通过其提供出来的,很多jvm性能工具都是基于这些接口来实现的;jdwp是java调试线协议,其主要规范了jvmti和jdi之间的通信协议,比如命令的格式是什么,回复的格式是什么等,当然还包括很多类型的定义,理论上其不包括通信层的实现,通信层的实现可以是socket,也可以是共享内存等;jdi位于最上层,定义了调试器所需要的调试接口,基于这些接口调试器可以方便地了解目标虚拟机的状态信息,大家最熟悉的有eclipse IDE。
那java debug的原理是什么呢,说简单点主要是通过实现jdwp的动态链接库,利用agentlib的机制(其实就是jvmti的扩展机制)在启动或者运行器动态执行动态链接库,-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:58140 ,类似如上的启动配置,jdwp是动态链接库的名称,会根据所在的平台自动查找对应的动态库,比如linux下会找到jdwp.so,mac下会找到jdwp.dylib等,至于这个agent怎么实现的就不多说了。
那回过来说说为什么说不能debug到rt.jar中的每行代码呢,该agent往jvmti环境中注册了一个回调方法,回调方法里干了啥呢,比如创建serversocket来等待连接,这主要在我们设置了调试端口,并且suspend=y的情况,该回调方法是在vm初始化完毕之后才去执行的,而在vm初始化的过程中通过启动类加载器已经加载了很多类了,执行了不少java逻辑,所以这些逻辑是根本跟踪不到的,比如sun.misc.Launcher的创建等。
相关推荐
但是,随着 antx 和 webx 的热部署插件的退役,Debug 时修改代码不能即时生效的问题变得越来越严重。 为了解决这个问题,现在可以使用万能插件 Direct Clark Error VM(简称 DCEVM),它可以直接替换 JVM 中的类,...
在Java开发过程中,调试是必不可少的一个环节,而有时我们可能会遇到在调试时无法查看JDK源代码中变量的值的情况。这篇文档详细介绍了如何解决这一问题,主要分为两个部分:编译JDK的源代码(src.zip)以及将编译后...
它包含了Java开发工具集(Java Development Kit)的所有核心组件的源代码,帮助程序员在遇到问题时能够查看底层实现,提升学习和调试效率。 1. **JDK.Attach**: 这个模块提供了与Java虚拟机(JVM)进行交互的接口,...
"vscode-java-debug" 是一个专为Visual Studio Code(VSCode)设计的插件,它的主要功能是提供Java语言的调试支持。这个插件使得开发者能够在VSCode这款流行的源代码编辑器中高效地调试他们的Java应用程序。通过安装...
vscode-java-debug 是一个专为VSCode设计的Java调试器插件,它提供了强大的Java应用调试功能,使得在VSCode中编写、运行和调试Java代码变得更加便捷。 【知识点详细说明】 1. **Visual Studio Code (VSCode)** - ...
2. **注意事项**:该功能仅限于当前线程的栈帧中回退,不能跨线程回退。 #### 六、远程调试 远程调试是指在本地机器上调试部署在远程服务器上的Java应用程序。这对于分布式系统的开发尤为重要。 1. **本机作为...
《Professional Java JDK 6 Edition》是一本专门为Java开发者和爱好者准备的专业指南,旨在深入解析Java Development Kit(JDK)6的各个方面。这本书由资深的Java专家编写,详细介绍了JDK 6的新特性和改进,帮助读者...
首先,我们要明确的是,JDK源码是Java开发的基石,它包含了Java运行时环境的所有核心类库。通过阅读源码,开发者可以直接看到各种类、方法的实现细节,这对于我们了解类库功能、学习设计模式以及排查问题有着极大...
用eclipse去debug jdk源码,默认情况下是看不到局部变量的。把这个生成的rt_debug.jar包复制到JDK_HOME\jre\lib\endorsed。如果没有endorsed目录,自己创建一下。 如果你是在eclipse中debug的。点击Eclipse上方窗口...
在Java开发过程中,远程调试是一项非常实用的功能,它允许开发者在不访问服务器本地环境的情况下,对运行在远程服务器上的应用程序进行调试。对于IntelliJ IDEA(Idea)用户,这个过程可以通过几步简单设置来实现。...
在 MyEclipse 6.5 中,需要安装 JDK 6 和 Tomcat 6,並将 Tomcat 的 launch mode 设置为 Debug mode。这一步骤非常重要,因为它将影响后续的 Debug 调试过程。 新建 Web 项目 在配置好环境之后,需要新建一个 Web ...
解决问题:eclipse调试显示jdk源码...如何使用:下载后放在jdk目录“jre\lib\endorsed”下,如果“endorsed”不存在就新建一个。 说明:适用于jdk1.8 参考链接: https://www.cnblogs.com/java-ding/p/10081911.html ...
总之,JDK 1.8.0_172是Java开发者不可或缺的工具,它不仅提供了运行Java应用程序的基础环境,还为开发、测试和优化代码提供了丰富的工具集。通过深入理解和熟练使用这个版本的JDK,开发者可以更好地发挥Java语言的...
用户可以使用 `/debug` 命令来调试 Java 代码,并使用 `/break` 命令来设置断点。Java Shell 还支持远程调试,允许用户在远程机器上调试 Java 代码。 Java Shell 的配置文件是 `jshell.conf`,用户可以在其中配置 ...
1. **JDK Debug工具**:Java Development Kit(JDK)内含强大的Java调试工具集(JDB),它是命令行工具,适用于基础的远程和本地调试。学习如何配置JDB,并使用其基本命令如`step`、`next`、`print`等进行单步执行、...
Java Development Kit(JDK)是Java编程语言的核心组件,它包含了一组开发工具,使得开发者能够编写、编译、调试和运行Java应用程序。在本例中,我们关注的是JDK的1.8.0_191版本。这个版本发布于2018年,是一个重要...
描述中提到的"支持DDMS",全称为Dalvik Debug Monitor Service(达尔文调试监控服务),是Android开发中用于调试应用程序的一个工具。在Java 8之前,DDMS是Android SDK的一部分,它允许开发者监控设备状态,如CPU...
Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。本文将详细介绍Oracle JDK 1.8在Linux 64位系统上的安装和使用,以及其对Java开发的重要性。 ...
7. **Java调试接口 (JDI)**:为开发调试工具提供了API,如Java Debug Wire Protocol (JDWP)。 8. **Java Mission Control (JMC)**:一个高级的性能分析和监控工具,虽然在1.8.0_101中未包含,但通常与JDK一起提供,...