作为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的创建等。
相关推荐
当我们调试Java程序时,我们无法查看JDK源代码中的变量的值,此文档解决了这个问题
用eclipse去debug jdk源码,默认情况下是看不到局部变量的。把这个生成的rt_debug.jar包复制到JDK_HOME\jre\lib\endorsed。如果没有endorsed目录,自己创建一下。 如果你是在eclipse中debug的。点击Eclipse上方窗口...
解决问题:eclipse调试显示jdk源码...如何使用:下载后放在jdk目录“jre\lib\endorsed”下,如果“endorsed”不存在就新建一个。 说明:适用于jdk1.8 参考链接: https://www.cnblogs.com/java-ding/p/10081911.html ...
可以debug和加注释的jdk源码,参考文章https://blog.csdn.net/lee0723/article/details/119871230
而是jdk不提供这方面的支持, 这时,有2种解决方法: 1: 下载jdk的debug版本,下载 双击安装 or 执行java -jar 命令 配置成eclipse的默认jvm 2:看DEBUG JDK.doc文档,看上传资料(已做好jar包)
接受方法源码java Java 调试器 概述 一个轻量级的 Java 调试器,基于它扩展了 . 它允许用户使用 Visual Studio Code (VS Code) 调试 Java 代码。 以下是功能列表: 启动/附加 断点/条件断点/日志点 例外 暂停并继续 ...
环境:myeclipse6.5 tomcat6 jdk6 初次使用后总结 步骤如下: debug调试java,web项目
The Java Development Kit (JDK) APIs are specific to the JDK and will not necessarily be available in all implementations of the Java SE Platform. These APIs are in modules whose names start with jdk....
将 rt_debug.jar 包复制到 jdk 根目录\jre\lib\endorsed 下,如果没有 endorsed 目录,手动创建即可。重启eclipse,调试jdk源码,即可显示局部变量信息
JDK帮助文档 SUN公司为 JDK 工具包提供了一整套文档资料,我们习惯上称之为 JDK 文档。 JDK 文档中提供了 Java 中的各种技术的详细资料,以及 JDK 中提供的各种类的帮助说明。 JDk 文档是 Java 语言的完整说明,大多数...
jdk提供的rt.jar进行debug调试时不能查看到局部变量的值,这是因为sun对rt.jar的类编译时,去除了调试信息,所以我们必须重新编译jdk源码并打包成rt.jar 编译步骤 解压jdk安装目录下的src.zip文件 遍历src目录下的...
WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in...
WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in...
The JDK is a development environment for building applications using the Java programming language. The JDK includes tools useful for developing and testing programs written in the Java programming ...
Java Development Kit contains the software and tools that you need to compile, debug, and run applets and applications written using the Java programming language. JDK has a collection of ...
WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in...
WARNING: These older versions of the JRE and JDK are provided to help developers debug issues in older systems. They are not updated with the latest security patches and are not recommended for use in...
注意:各个版本代码会略有区别,甚至都是JDK1.7,如Java SE Development Kit 7u1和Java SE Development Kit 7u80。 日积月累,学习JDK相关源码以及基础知识: : JDK原始代码重新打包,支持调试JDk二进制时显示...
remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons...
看不到源码java编程 java编程 #下载 Java JDK 1.7 或 1.8 JDK 1.7 - JDK 1.8 - #IDE Eclipse:下载 STS : 对于 Window OS 说明,请参见: Mac OS:同时安装 JDK java 1.7 和 1.8 Install java jdk 1.7 Install java ...