`
nijiaben
  • 浏览: 129152 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java debug体系为什么不能debug到jdk里所有的代码

    博客分类:
  • JVM
阅读更多

       作为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->jdijvmti是一套本地代码接口,jvm暴露出来的扩展接口,所有的调试功能都是通过其提供出来的,很多jvm性能工具都是基于这些接口来实现的;jdwpjava调试线协议,其主要规范了jvmtijdi之间的通信协议,比如命令的格式是什么,回复的格式是什么等,当然还包括很多类型的定义,理论上其不包括通信层的实现,通信层的实现可以是socket,也可以是共享内存等;jdi位于最上层,定义了调试器所需要的调试接口,基于这些接口调试器可以方便地了解目标虚拟机的状态信息,大家最熟悉的有eclipse IDE

    

       java debug的原理是什么呢,说简单点主要是通过实现jdwp的动态链接库,利用agentlib的机制(其实就是jvmti的扩展机制)在启动或者运行器动态执行动态链接库,-agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:58140 ,类似如上的启动配置,jdwp是动态链接库的名称,会根据所在的平台自动查找对应的动态库,比如linux下会找到jdwp.somac下会找到jdwp.dylib等,至于这个agent怎么实现的就不多说了。

 

       那回过来说说为什么说不能debugrt.jar中的每行代码呢,该agentjvmti环境中注册了一个回调方法,回调方法里干了啥呢,比如创建serversocket来等待连接,这主要在我们设置了调试端口,并且suspend=y的情况,该回调方法是在vm初始化完毕之后才去执行的,而在vm初始化的过程中通过启动类加载器已经加载了很多类了,执行了不少java逻辑,所以这些逻辑是根本跟踪不到的,比如sun.misc.Launcher的创建等。

4
0
分享到:
评论
2 楼 nijiaben 2013-04-08  
javafound 写道
,哈哈,回归啦~

嚓,发现得真快,好久没写文章了,手都生了,唉,之前的flex blog被关了。。
1 楼 javafound 2013-04-08  
,哈哈,回归啦~

相关推荐

    查看JDK中变量的值, debug JDK

    当我们调试Java程序时,我们无法查看JDK源代码中的变量的值,此文档解决了这个问题

    jdk1.8.0_66 debug源码,查看局部变量

    用eclipse去debug jdk源码,默认情况下是看不到局部变量的。把这个生成的rt_debug.jar包复制到JDK_HOME\jre\lib\endorsed。如果没有endorsed目录,自己创建一下。 如果你是在eclipse中debug的。点击Eclipse上方窗口...

    eclipse调试显示jdk源码变量的rt_debug.jar

    解决问题:eclipse调试显示jdk源码...如何使用:下载后放在jdk目录“jre\lib\endorsed”下,如果“endorsed”不存在就新建一个。 说明:适用于jdk1.8 参考链接: https://www.cnblogs.com/java-ding/p/10081911.html ...

    可以debug和加注释的jdk源码

    可以debug和加注释的jdk源码,参考文章https://blog.csdn.net/lee0723/article/details/119871230

    解决 eclispe/myeclipse 无法 debug into jdk

    而是jdk不提供这方面的支持, 这时,有2种解决方法: 1: 下载jdk的debug版本,下载 双击安装 or 执行java -jar 命令 配置成eclipse的默认jvm 2:看DEBUG JDK.doc文档,看上传资料(已做好jar包)

    accept方法源码java-vscode-java-debug:用于VisualStudio代码的Java调试器

    接受方法源码java Java 调试器 概述 一个轻量级的 Java 调试器,基于它扩展了 . 它允许用户使用 Visual Studio Code (VS Code) 调试 Java 代码。 以下是功能列表: 启动/附加 断点/条件断点/日志点 例外 暂停并继续 ...

    myeclipse的debug调试步骤总结

    环境:myeclipse6.5 tomcat6 jdk6 初次使用后总结 步骤如下: debug调试java,web项目

    jdk-9.0.1_doc-all 最新版

    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

    将 rt_debug.jar 包复制到 jdk 根目录\jre\lib\endorsed 下,如果没有 endorsed 目录,手动创建即可。重启eclipse,调试jdk源码,即可显示局部变量信息

    jdk1.9帮助文档中文版

    JDK帮助文档 SUN公司为 JDK 工具包提供了一整套文档资料,我们习惯上称之为 JDK 文档。 JDK 文档中提供了 Java 中的各种技术的详细资料,以及 JDK 中提供的各种类的帮助说明。 JDk 文档是 Java 语言的完整说明,大多数...

    java查看sun包源码-rt_debug:将jdk的源码进行重新编译,用于局部变量的调试

    jdk提供的rt.jar进行debug调试时不能查看到局部变量的值,这是因为sun对rt.jar的类编译时,去除了调试信息,所以我们必须重新编译jdk源码并打包成rt.jar 编译步骤 解压jdk安装目录下的src.zip文件 遍历src目录下的...

    jdk1.1 1.2 1.3 1.4 5 6安装程序

    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...

    jdk-6u45-linux-i586

    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.8-windows-x64(官方WINDOW正式版)

    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 ...

    jdk-8u144-windows-x64

    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 ...

    jdk-7u80-linux-x64.rpm.zip

    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...

    jdk-7u80-linux-x64.tar.gz.zip

    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...

    JDK:多个JDK版本的源代码(1.61.71.81.91011121314 JDK的src.zip),仅用于学习; “ rt_debug.jar”可用于调试-Source code learning

    注意:各个版本代码会略有区别,甚至都是JDK1.7,如Java SE Development Kit 7u1和Java SE Development Kit 7u80。 日积月累,学习JDK相关源码以及基础知识: : JDK原始代码重新打包,支持调试JDk二进制时显示...

    修改版json-lib-2.4-jdk14与json-lib-2.4-jdk13 支持JDK1.4与1.3与1.5

    remove是java.lang.ThreadLocal类的方法,但是jdk1.4中,却没有这个方法的实现,jdk1.5中有这个方法,因此是没问题的; 本jar包经过改造,适用于JDK1.4,需要第三方JAR包的支持(commons-beanutils-1.8.2.jar,commons...

    java8看不到源码-java-programming:java编程

    看不到源码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 ...

Global site tag (gtag.js) - Google Analytics