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里所有的代码相关推荐

  1. Java常见面试知识点:继承、接口、多态、代码块

    问题:Java常见面试知识点:继承.接口.多态.代码块 答案: 1.继承 继承中构造方法的访问特点 子类中所有的构造方法默认都会访问父类中无参的构造方法 为什么? • 子类在初始化的时候,有可能会使用 ...

  2. 使用Dwr时出现java.lang.SecurityException: Access to debug pages is denied

    问题描述:项目中使用了Dwr技术时,出现了java.lang.SecurityException: Access to debug pages is denied描述错误提示 解决方法: 在配置文件w ...

  3. Java 技术体系(JDK 与 JRE 的关系)、POJO 与 JavaBeans

    Java 技术体系的分层结构(不同的颜色表示不同的层次),尤其注意 JDK 与 JRE 之间的包含关系: 图见 Java Platform Standard Edition 7 Documentati ...

  4. 【Java】带你走进Debug的世界

    关于Debug和本文 Debug,意为"调试",是程序员必备技能之一. Debug开始用的时候还是很不习惯的,需要适应,本文面向新手介绍Debug相关内容. Debug的三种手段 ...

  5. 深入Java调试体系之JDWP协议及实现

    为什么80%的码农都做不了架构师?>>>    此内容是该系列 4 部分中的第 3 部分: 深入 Java 调试体系 第 1 部分: JPDA 体系概览 第 2 部分: JVMTI ...

  6. java知识体系介绍

    国内最牛七星级团队马士兵.高淇等11位十年开发经验专家录制 目 录 百战程序员Java1573题 2百战程序员介绍 3JavaSE编程基础 9第一章 初识Java 9阶段项目课程1 11第二章 数据类 ...

  7. Java学习体系(骨灰级详细)

    一颗小草,一个学生.因为没有在这里看到我想见的内容,那便自己写.发表一下自己对于Java的拙见.(待完善:1/10) 预计有五个阶段,目前待完善. 一,Java基础 第一阶段(Java基础) 01-环 ...

  8. Java日志体系详解

    一.日志框架的分类 1.1.门面型日志框架: JCL:Apache基金会所属的项目,是一套Java日志接口,之前叫Jakarta Commons Logging,后更名为Commons Logging ...

  9. 深入掌握Java日志体系,再也不迷路了

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 对于一个应用程序来说日志记录是必 ...

最新文章

  1. tornado 入门
  2. Nat. Biotechnol | PHATE:高维生物数据的可视化方法
  3. linux常用操作命令详解
  4. webstore报 ESLint: Expected space or tab after '//' in comment.(spaced-comment)
  5. Frame帧动画帧布局Android
  6. C++list容器实现按照年龄升序排列,年龄相同按照身高降序排列,年龄身高相同对体重升序排列
  7. TFS源代码管理的8大注意事项
  8. 华为笔试题 字符串解压缩(C语言解法)
  9. tpadmin导入数据库问题
  10. 不能访问网络位置的解决方法(转)
  11. 剑指offer题目记录
  12. 从公司角度来看,为什么要招实习生?
  13. 2022-2027年中国闪速存储器集成电路行业市场深度分析及发展战略规划报告
  14. HD44780http://blog.sina.com.cn/s/blog_61b6e08b01016xif.html
  15. .Net 互联网技术(一)分布式ID生成方法生成演变
  16. 罗切斯特大学计算机科学硕士介绍,罗切斯特大学计算机科学专业
  17. 穷查理宝典--人类误判心理学思维导图
  18. 测试进阶Mockserver之Moco框架搭建使用
  19. js Date中的T和Z (实用,赞)
  20. 计算机网络基础之表示层的功能和服务

热门文章

  1. 用Php设置Iptables,如何使用CSF添加自定义iptables规则
  2. 提前“剧透”能提高自监督学习性能吗?华为诺亚实验室说:不一定!
  3. 百度ACE智能交通能提升最高30%城市通行效率,刚刚拿下世界互联网大会最高荣誉...
  4. 用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星
  5. 关于数字化转型,IDC发布了他们的新观点
  6. NSA释出逆向工程工具GHIDRA针对恶意软件逆向分析
  7. zabbix对一台主机监控的操作
  8. 新东家要哭了,雅虎终于承认上亿用户数据被盗
  9. C++ const与define
  10. C#非泛型集合类-ArrayList数组集合类