java debug体系为什么不能debug到jdk里所有的代码
2019独角兽企业重金招聘Python工程师标准>>>
作为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的创建等。
转载于:https://my.oschina.net/u/3053535/blog/789886
java debug体系为什么不能debug到jdk里所有的代码相关推荐
- Java常见面试知识点:继承、接口、多态、代码块
问题:Java常见面试知识点:继承.接口.多态.代码块 答案: 1.继承 继承中构造方法的访问特点 子类中所有的构造方法默认都会访问父类中无参的构造方法 为什么? • 子类在初始化的时候,有可能会使用 ...
- 使用Dwr时出现java.lang.SecurityException: Access to debug pages is denied
问题描述:项目中使用了Dwr技术时,出现了java.lang.SecurityException: Access to debug pages is denied描述错误提示 解决方法: 在配置文件w ...
- Java 技术体系(JDK 与 JRE 的关系)、POJO 与 JavaBeans
Java 技术体系的分层结构(不同的颜色表示不同的层次),尤其注意 JDK 与 JRE 之间的包含关系: 图见 Java Platform Standard Edition 7 Documentati ...
- 【Java】带你走进Debug的世界
关于Debug和本文 Debug,意为"调试",是程序员必备技能之一. Debug开始用的时候还是很不习惯的,需要适应,本文面向新手介绍Debug相关内容. Debug的三种手段 ...
- 深入Java调试体系之JDWP协议及实现
为什么80%的码农都做不了架构师?>>> 此内容是该系列 4 部分中的第 3 部分: 深入 Java 调试体系 第 1 部分: JPDA 体系概览 第 2 部分: JVMTI ...
- java知识体系介绍
国内最牛七星级团队马士兵.高淇等11位十年开发经验专家录制 目 录 百战程序员Java1573题 2百战程序员介绍 3JavaSE编程基础 9第一章 初识Java 9阶段项目课程1 11第二章 数据类 ...
- Java学习体系(骨灰级详细)
一颗小草,一个学生.因为没有在这里看到我想见的内容,那便自己写.发表一下自己对于Java的拙见.(待完善:1/10) 预计有五个阶段,目前待完善. 一,Java基础 第一阶段(Java基础) 01-环 ...
- Java日志体系详解
一.日志框架的分类 1.1.门面型日志框架: JCL:Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging ...
- 深入掌握Java日志体系,再也不迷路了
点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 对于一个应用程序来说日志记录是必 ...
最新文章
- tornado 入门
- Nat. Biotechnol | PHATE:高维生物数据的可视化方法
- linux常用操作命令详解
- webstore报 ESLint: Expected space or tab after '//' in comment.(spaced-comment)
- Frame帧动画帧布局Android
- C++list容器实现按照年龄升序排列,年龄相同按照身高降序排列,年龄身高相同对体重升序排列
- TFS源代码管理的8大注意事项
- 华为笔试题 字符串解压缩(C语言解法)
- tpadmin导入数据库问题
- 不能访问网络位置的解决方法(转)
- 剑指offer题目记录
- 从公司角度来看,为什么要招实习生?
- 2022-2027年中国闪速存储器集成电路行业市场深度分析及发展战略规划报告
- HD44780http://blog.sina.com.cn/s/blog_61b6e08b01016xif.html
- .Net 互联网技术(一)分布式ID生成方法生成演变
- 罗切斯特大学计算机科学硕士介绍,罗切斯特大学计算机科学专业
- 穷查理宝典--人类误判心理学思维导图
- 测试进阶Mockserver之Moco框架搭建使用
- js Date中的T和Z (实用,赞)
- 计算机网络基础之表示层的功能和服务
热门文章
- 用Php设置Iptables,如何使用CSF添加自定义iptables规则
- 提前“剧透”能提高自监督学习性能吗?华为诺亚实验室说:不一定!
- 百度ACE智能交通能提升最高30%城市通行效率,刚刚拿下世界互联网大会最高荣誉...
- 用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星
- 关于数字化转型,IDC发布了他们的新观点
- NSA释出逆向工程工具GHIDRA针对恶意软件逆向分析
- zabbix对一台主机监控的操作
- 新东家要哭了,雅虎终于承认上亿用户数据被盗
- C++ const与define
- C#非泛型集合类-ArrayList数组集合类