1、Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)
2、最新Mac版本OpenJDK8编译调试源码下载(直接使用无需修改,简单方便)
3、Mac10.14下使用Clion调试OpenJDK8最新教程(附源码)
源码移步>>>最新Mac版本OpenJDK8编译调试源码下载(直接使用无需修改,简单方便)
通过前面的文章“Mac10.14下使用Xcode10编译调试OpenJDK8最新教程(附源码)”我们已经编译好了OpenJDK了。本篇文件我们将讲解如何在mac下使用Clion导入源码并进行debug调试。
由于我们使用了compiledb包装编译OpenJDK源码。所以编译完成之后我们在源码根目录可以看到多了一个compile_commands.json文件,该文件由compiledb生成。我们的工程导入则依赖这个json文件。
打开Clion,然后点击Open打开上述compile_commands.json文件,并在弹出的对话框中选择Open as Project。
导入之后需要等一段时间,Clion需要做一些准备工作,比如构建索引等,这个过程会优点长。等待一起OK之后,则进入Clion的preferences->Build,Execution,Deployment->Custom Build Targets,在改配置页面点击Add Target配置自定义的Build Targets。
在弹出对话框中配点击...配置Tools.
在配置Tool界面配置make_jdk8u,具体内容如下:其中arguments填写:CONF=macosx-x86_64-normal-server-slowdebug,Working directory则添加源码的根目录。
在配置Tool界面配置clean_jdk8u,具体内容如下:其中arguments填写:CONF=macosx-x86_64-normal-server-slowdebug clean,Working directory则添加源码的根目录。
然后再Clutom Build Targets完整具体配置,具体配置如下:
接着在Clion主页面点击Add Configuration,新增配置Run/Debug Configurations。
在配置页面新增Clustom Build Applications,并作如下配置。其中Executable选择我们自己编译好的java文件。同时需要删除Before lanches中的Build。
配置完成之后的界面如下:
在完成所有配置周,我们就可以开始调试代码了。首先在jni.cpp的create_vm中添加打一个断点。
然后直接点击debug按钮。
如果点击debug按钮没有任何反应,但是点击运行按钮则可以正常输出java版本信息(如下)。
如果直接运行正常,则点击debug看看控制台是否报错ProtobufClient.cpp:203] ERROR, no such host as localhost:
如果报上述错则需要在本机的host中配置 127.0.0.1 localhost。
之后在点击debug就不会报错了,但是不出意外会报如下错误。
这个错误直接点击跳过断点即可,但是每次debug都会有这个错误,所以提供一个终极解决办法。在mac的用户根目录(在命令行直接输出cd回车就是用户根目录)新建一个.lldbinit(前面有个点)文件。并在改文件中添加内容:breakpoint set --file /你的目录/jdk8u/hotspot/src/share/vm/prims/jni.cpp --line 5219 -C "pro hand -p true -s false SIGSEGV SIGBUS" --auto-continue true。其中“你的目录”就是你的源码所在的绝对路径。
一起完成之后,再次点击debug按钮,此时就会正常进入断点了。
到此真个debug的调试设置好了。赶紧操练起来吧。
细心的同学应该发现了咱们的编译和其他同学有些不同,咱们编译使用了compiledb包装编译,然后通过compile_commands.json文件来导入的openjdk8源码,使用这种编译方式主要是为了解决导入工程之后头文件找不到的问题。这种方式和普通的make的编译有如下三个不同:
1、我们这种编译方式所以导入之后并没有像其他同学说的导入之后头文件找不到的问题。也就不需要手动添加头部文件。细心的同学应该注意到了,咱们的工程中根本就没有CMakeLists.txt文件哦。
如果你不是通过compiledb包装编译的,则需要手工导入头文件,否则会出现头文件找不到的问题。具体可以参考:https://www.jianshu.com/p/ee7e9176632c
2、咱们这种编译方式和他们的还有一个不一样的地方,那就是咱们这种方式导入的是整个源码工程。而普通的make编译方式导入的则是源码工程下的hotspot工程源码。
3、最后一个不同是砸门这种方式在clion中需要创建Clutom Build Targets。同时在配置Run/Debug Configurations的时候选择的Clutom Build Application。而使用常规的make方式则配置的CMake Application,且不需要配置Clutom Build Targets。
https://www.jianshu.com/p/d9a1e1072f37
https://blog.csdn.net/davi_qiang/article/details/82817852
https://www.jianshu.com/p/d9a1e1072f37
https://www.cnblogs.com/yuhangwang/p/11298540.html
https://www.jianshu.com/p/ee7e9176632c
https://blog.csdn.net/y3over/article/details/103127782
https://blog.csdn.net/quantum7/article/details/108466760
https://www.jianshu.com/p/0fc877be4c3d
如果你对本文有任何疑问或者高见,欢迎添加公众号lifeofcoder共同交流探讨(添加公众号可以获得楼主最新博文推送以及”Java高级架构“上10G视频和图文资料哦)。