OpenJDK调试
1. 导入项目
1.1 compile_commands.json
阅读C++代码时如果能够很方便地跳转到函数、类型定义处,会极大地提高效率。使用 grep 或 ctags 或 gtags 的问题在于给出的结果不够严谨,可能会给出很多候选,容易打断思路,另一方面 c++ 本身语法非常复杂,继承、重载等会让选择正确的跳转处变得更加困难, ctags 或 gtags 之类的静态代码分析工具对 c++ 的支持也相当有限。
clang 编译器较之 gcc 在进行代码分析方面提供了良好的支持,编译器给出的结果往往是最正确和最丰富的。
编译数据库(compile_commands.json
)里面记录了每一个源代码文件对应的编译命令,有了编译数据库就可以从 clang 编译器获取最详尽的代码分析数据,让代码跳转、自动完成更加精确。
openjdk-12及以上的版本可以采用compile_commands.json导入,这种方式导入可以解决clion采用生成CMakeLists.txt而部分openjdk源码出现头文件无法找到的问题 JetBrains关于Compilation DataBase的介绍:https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/。
1.2 生成
在openjdk源码根目录执行make命令
- 方法一:make compile-commands
- 方法二:make CONF=macosx-aarch64-server-slowdebug compile-commands 注意:我这里因为是M1芯片,所以用的参数是aarch64,如果是Intel芯片,可以使用make CONF=macosx-x86_64-normal-server-slowdebug compile-commands
1 | # 方法一:生成compile-coomands.json |
1.3 CLion通过compile_commands.json导入openjdk源码
打开CLion,File→Open→选择文件:
/Users/godwit/Source/openjdk-18+36/build/macosx-aarch64-server-slowdebug/compile_commands.json
之后CLion会做扫描和index,但是这时候还看不到源码相关的文件和目录,因为此时根目录是/Users/saleson/c-projects/jdk-jdk-16-ga/build/macosx-x86_64-server-slowdebug, 需要更改项目根目录。
操作路径:Tools -> Compilation Database -> Change Project Root
选中openjdk的源码根目录,本文档中的源码根目录是/Users/saleson/c-projects/jdk-jdk-16-ga
CLion再次扫描文件和建立index,结束后就可以看到源码了,且不会提示无法找到头文件
2. 调试配置
3. 实战一:调试java -version
java.c文件里面的JavaMain函数是入口,再次打上断点,发现断点命中,可以进行调试。
4. 实战二:调试java类
将java文件先编译为class文件。
1 | package com.godwit.study.park; |
发现断点已经正常中断。
5. 代码修改
我们发现JDK源代码修改之后,再进行Debug,不会生效。如何处理呢?
第一步:源代码路径下执行:make images
1 | godwit@Firebase ~/Source/openjdk-18+36 make images |
第二步:在CLion中调试,即可生效。
6. 参考链接
- Post title:OpenJDK调试
- Post author:Mayfly Game
- Create time:2022-05-04 21:44:13
- Post link:https://www.mayflygame.com/2022/05/04/OpenJDK调试/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.