概述
前面安装gdb调试hotspot里面,我记录了自己安装gdb调试hotspot的过程。后来我发现,使用gdb的时候,一般都是和eclipse结合在一起使用。而我作为一个有洁癖的开发,我实在不想自己的电脑上安装那么多东西,毕竟我已经安装了xcode和idea了。于是我尝试使用XCode来debug hotspot。
对于一些gdb大神来说,可能直接使用gdb命令行就可以了,根本不需要什么eclipse。可惜的是,我不是这种大神,我是一个gdb方面的小菜鸡,干不来那种事情……
幸运的是,网上也有一些使用XCode来debug Hotspot的博客(如OpenJDK9 Hotspot Mac OSX 编译和调试,我参考着试了一下,记录自己使用XCode来debug的过程。
编译JDK
编译JDK可以参考Mac上编译JDK和安装gdb调试hotspot。尤其要注意的是,要编译成debug的版本
创建项目
准备空项目
首先打开Xcode创建一个Command Line Tool项目:


创建的项目形如:

把原本的文件都删掉:

修改运行目标
首先调出schema窗口


删除这个build目标,毕竟我们已经构建好了:

而后修改运行目标:



修改为编译后的java命令路径,在我的机器上的路径是:
/Users/xxx/git/openjdk/build/macosx-x86_64-server-fastdebug/jdk/bin
导入源码
把hotspot的源码导入项目:

选择hotspot目录(位于openjdk_root/src/hotpsot)下的所有文件和目录,点击确定:

开始debug
找到jni.cpp:

找到JNI_CreateJavaVM方法,打上断点:

点击运行:

出现了一个SIGSEGV错误:

在左下角的命令行里面执行命令:
process handle SIGSEGV --stop=false

而后点击下一步,就会出现:

到这一步,我们成功在Xcode里面debug hotspot了。
说到这里,我眼泪都下来了,想起了过往自己傻逼用gdb+eclipse的艰难历程。
左边的那一大堆线程
下图展示了一大堆的线程:

这些线程我还是认识一些,我整理了一下这些线程和它们承担的主要工作,慎重看待,因为我也是连蒙带猜的:
- GC Thread: 毫无疑问,就是GC的线程;
- G1 Main Marker: G1垃圾收集器main marker线程。这个线程负责mark cycle;
- G1 conc: G1并发线程,用于标记(这个时候还没有触发GC);
- G1 young RemSet Sampling: G1用于判断是否需要进行young gc的线程(我觉得这种表述不是很准确)
- VM Thread: 虚拟机主线程
- Reference Handler:Java引用处理的线程。一般在GC过程会涉及到引用处理;
- Signal dispatcher:接收并且分发来自操作系统的信号。比如说,当你按下ctrl-c试图关闭JVM的时候,它就会工作了。还有线程的状态变迁等的信号也是这个东西分发的;
- C1 CompilerThread和C2 Compiler Thread:这是HotSpot JIT的线程。C1和C2其实就对应了JVM JIT的等级;
- sweeper thread: 清扫线程,GC使用的;
- VM periodic task thread: JVM处理一些周期性任务的线程。典型的例子就是G1里面可以设置mark cycle的周期。本质上就是这个线程来调度的;
其他的就不认识了。
我的公众号:

网友评论