一、问题说明

环境说明:

jdk:jdk1.8.0_161

阅读过jdk源码的人,肯定遇到过这个问题:当你在源码中写过注释,然后再次打断点,你就会发现提示你“Source code does not match the bytecode”。接下来我们来解决这个问题

如果不清楚如何在idea中搭建jdk1.8源码阅读环境的,可以参看https://blog.csdn.net/u010999809/article/details/101922489

二、解决问题

我在网上找了下,有现成的解决方法,就是再重新编译一次带调试信息的jdk源码(https://www.jb51.net/article/115931.htm,https://blog.csdn.net/wl23301/article/details/35792235,https://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is)

提前解释下名词,底下说的源码,是指你写过注释后的源码

简单再说下步骤:

把源码解压放到f盘(放到根目录,这样路径不用写太长),在f盘创建jdk_debug目录

进到f盘根目录,打开cmd命令窗口
1. 生成需要编译的文件列表
dir /B /S /X src\*.java > filelist.txt

2. 执行编译操作(rt.jar是在JDK_HOME\jre\lib下找的,tools.jar是在JDK_HOME\lib下找的)
javac -J-Xms16m -J-Xmx1024m -sourcepath f:\src -cp f:\rt.jar;f:\tools.jar -d f:\jdk_debug -g @filelist.txt >> log.txt 2>&1
(如果只是编译一小部分,只用rt.jar没问题;要编译完整的,就还得加上tools.jar)

3. 生成rt_debug.jar
进入jdk_debug目录执行命令jar cf0 rt_debug.jar *

4. 把新生成的jar包放到JDK_HOME\jre\lib\endorsed中(如果没有endorsed文件夹,则手动创建)

既然这个过程已经非常明确了,我就想能不能写成一个bat脚本,每次只要执行过一次,sourcecode就和bytecode就一致了,毕竟每次都要手动敲一遍上面这个步骤还是比较费时间的

下面是我写的脚本(里面保留了一些注释,如果要调试的话,解开某些部分,或者自己添加都可以),里面注释写的很详细

compileSourceCode.bat

@echo offrem 记录当前位置
set "CURRENT_DIR=%cd%"rem jdk源码目录
cd ..
set "SOURCE_DIR=%cd%\src"
cd /d %CURRENT_DIR%rem 编译rt_debug.jar存放的目录
set "RT_DEBUG_DIR=%CURRENT_DIR%\jdk_debug"rem jdklib目录(编译代码要用的)
rem set "LIB_PATH=%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\tools.jar"
set "LIB_PATH=%JAVA_HOME%\jre\lib\rt.jar %JAVA_HOME%\lib\tools.jar"rem rt_debug.jar需要存放的位置
set "RT_DEBUG_ENDORSED_DIR=%JAVA_HOME%\jre\lib\endorsed"rem 显示JAVA_HOME变量
rem echo "%JAVA_HOME%"rem 如果jdk_debug不存在,则进行创建
if not exist "%RT_DEBUG_DIR%" mkdir "%RT_DEBUG_DIR%"rem 生成需要编译的文件列表
dir /B /S /X "%SOURCE_DIR%\*.java" > "%CURRENT_DIR%\filelist.txt"rem 执行编译操作
rem javac可能不支持在指定cp的时候,写不同路径的jar包,这里简单起见,直接把rt.jar和tools.jar复制到当前目录下
rem javac -J-Xms16m -J-Xmx1024m -encoding UTF-8 -sourcepath %SOURCE_DIR% -cp %LIB_PATH% -d %RT_DEBUG_DIR% -g @filelist.txt >> log.txt 2>&1rem 批量将jar包复制到当前目录下(如果不存在,则复制过去)
rem 临时存放路径的变量
set "my_path="
setlocal EnableDelayedExpansion
for %%i in (%LIB_PATH%) do (
rem setlocal
call:getFileName "%%i"
if not exist "!my_path!" copy /y "%%i" "%CURRENT_DIR%"
rem endlocal
)
setlocal DisableDelayedExpansionjavac -encoding UTF-8 -J-Xms16m -J-Xmx1024m -sourcepath %SOURCE_DIR% -cp rt.jar;tools.jar -d %RT_DEBUG_DIR% -g @filelist.txt >> log.txt 2>&1rem 生成rt_debug.jar
cd /d "%RT_DEBUG_DIR%"&&jar cf0 rt_debug.jar *rem 把新生成的jar包放到JDK_HOME\jre\lib\endorsed中(如果没有endorsed文件夹,则手动创建)
if not exist "%RT_DEBUG_ENDORSED_DIR%" mkdir "%RT_DEBUG_ENDORSED_DIR%"
copy /y "%RT_DEBUG_DIR%\rt_debug.jar" "%RT_DEBUG_ENDORSED_DIR%\rt_debug.jar"rem pause&goto:eof
goto:eof&exitrem 自定义函数:通过全路径获得文件名
:getFileName
rem for %%a in ("%~1") do (echo %%~nxa)
rem for %%a in ("%~1") do (echo %CURRENT_DIR%\%%~nxa)
for %%a in ("%~1") do (
set "my_path=%CURRENT_DIR%\%%~nxa"
)
goto:eofrem 参考链接
rem 如何在bat脚本中定义函数? https://www.jb51.net/article/53016.htm
rem 如何从文件全路径中提取文件名? https://blog.csdn.net/techfield/article/details/83061295
rem 常用匹配模式 https://www.jb51.net/article/97588.htm
rem for循环中无法改变变量的值 https://zhidao.baidu.com/question/140583844767053805.html
rem https://www.cnblogs.com/mq0036/p/3478108.html

三、对脚本的说明

我在网上看到过很多提供脚本文章,可能由于作者本身个人习惯原因,通常可能相关的环境(目录之间的层级关系是否有特定要求,如果需要做修改哪些地方是需要注意的)不会说的太详细,导致别人在拿来用的时候,需要花大量的时间来进行调试。这里我做下说明:

我创建了一个普通的java项目,如下图所示,

src目录下就是jdk源码,

test目录放的是单元测试,

scripts目录下只用放一个compileSourceCode.bat脚本文件,该目录里其他的东西都是bat脚本执行后产生的

我目前觉得自己的目录结构算是划分的比较清晰的,如果有人有需要看源码的我也会建议按我这种方式。

bat脚本里面主要就是SOURCE_DIR,RT_DEBUG_DIR这两个目录,其他都是固定的,没什么可改的

用的话,非常简单,给jdk源码写过注释后,再双击下compileSourceCode.bat,等个2~3min就ok了

参考链接:

如何编译带调试信息的jdk源码?(这几个链接我都看过,都差不多,我通常会找中文和英文的相关链接来做验证,一般我会更偏重于找英文的解答)

https://www.jb51.net/article/115931.htm

https://blog.csdn.net/wl23301/article/details/35792235

https://stackoverflow.com/questions/18255474/debug-jdk-source-cant-watch-variable-what-it-is

写bat脚本时参考的链接(写的过程确实比较曲折,因为平时工作不需要写脚本,导致这块很生疏,查了很多资料;但是想想一个脚本可以节省出很多重复敲代码的时间,觉得这还是挺值得的)

如何在bat脚本中定义函数?https://www.jb51.net/article/53016.htm

如何从文件全路径中提取文件名?https://blog.csdn.net/techfield/article/details/83061295

常用匹配模式 https://www.jb51.net/article/97588.htm

for循环中无法改变变量的值 https://zhidao.baidu.com/question/140583844767053805.html

https://www.cnblogs.com/mq0036/p/3478108.html

jdk源码写过注释后debug提示source code does not match the bytecode相关推荐

  1. idea remote debug Source code does not match the bytecode

    最近在idea 上进行remote debug的时候总是出现Source code does not match the bytecode,现记录原因 首先看现象 原因如下,idea在remote d ...

  2. idea中自定义修改jdk源码,加注释

    前言 最近打算出jdk源码的博客,想在源码基础上加注释,在此把方法分享给大家. 处理方法 打开project structures,选择sdk. 根据上方的路径,找到zip包,进行解压. 然后删除掉z ...

  3. JDK源码阅读环境搭建

    内容来源 B站Up主: CodeSheep 视频: https://www.bilibili.com/video/BV1V7411U78L 感谢大佬分享学习心得 Thanks♪(・ω・)ノ~~~ 1. ...

  4. idea 关联jdk源码_idea搭建阅读jdk源码教程(详细版)

    最近正在阅读jdk源码,首先在搭建阅读jdk源码过程中遇到了一些问题,在此分享一下自己的经验,以供大家参考. 1.阅读jdk源码之前要先获得jdk的源码,大家可以在网上下载到jdk源码,在此我提供另外 ...

  5. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  6. 写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  7. mac idea中添加JDK源码注释

    一.打开JDK安装路径,然后解压src.zip到当前目录. 二.打开idea中File -> Project Structure -> SDKs,点击正下放的"-"符号 ...

  8. 设置Eclipse可以Debug模式调试JDK源码,并显示局部变量的值

    最近突然萌发了研究JDK源码的想法,所以就想到了在自己常用的Eclipse上可以调试JDK源码. 整个设置过程也很简单: 首先你要安装好JDK(我的JDK安装路径根目录是D:\Java\jdk-8u9 ...

  9. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

最新文章

  1. 最高3000元/人 , 助你成为C站红人 !
  2. 《计算机视觉:模型、学习和推理》一3.6 正态逆伽马分布
  3. Polycarp Restores Permutation
  4. 可用子网数要不要减2_CCNA最实用的复习知识点(2)
  5. QPS、TPS、并发用户数、吞吐量的关系
  6. (九)演员-评论员算法
  7. 注册域名需要资格吗_域名对于企业商标注册的重要性你知道吗?
  8. HIDL第一个Hello World
  9. Centos6 import tensorflow遇到的问题
  10. java人脸识别Demo(数据库mongo)
  11. 阅读 深入理解JVM虚拟机笔记一
  12. 小米手机运行linux,在Linux系统下使用小米刷机工具:XiaoMiTool V2(XMT2)
  13. 在linux中安装snort框架
  14. 需求分析模板_如何进行培训需求分析?
  15. P2P网贷谋求“去担保”:引入保险 收益下滑
  16. 新手使用PHPCUSTOM打开php文件变下载的原因分析
  17. docker CMD 命令
  18. 漫画:用木兰从军说外观模式
  19. 【JAVAFX UI欣赏 之 滑条频谱】
  20. 支持html5特性的浏览器,五大主流浏览器对CSS3和HTML5特性支持情况的详细清单

热门文章

  1. C语言简单实现打字游戏,小霸王其乐无穷!
  2. 使用proxmark3修改UID卡的0号扇区
  3. web调用服务器的exe文件,浏览器Web调用exe程序文件
  4. 索尼 LT22i 刷机总结
  5. 关于小米路由器青春版刷老固件
  6. centos7.8 安装部署 k8s 集群
  7. 网站web服务器分析小程序
  8. 2019 CNCF的中国云原生调查报告
  9. 2019款奔驰E级:三次改款上市,奔驰到底在做什么?
  10. 锐捷ac怎么发现局域网ap_【无线】无线查看限速配置(AC和AP的命令一样)