美文网首页jvm虚拟机
Xcode debug Hotspot(一)——创建Xcode项

Xcode debug Hotspot(一)——创建Xcode项

作者: flycash | 来源:发表于2018-12-05 00:16 被阅读88次

概述

前面安装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项目:


Command Line Tool项目 C++

创建的项目形如:


新项目

把原本的文件都删掉:


空项目

修改运行目标

首先调出schema窗口


Schema路径
build

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


删除后的build

而后修改运行目标:


运行目标
选择文件
修改后运行目标

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

导入源码

把hotspot的源码导入项目:


导入源码

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


选择HotSpot源码

开始debug

找到jni.cpp:


jni.cpp

找到JNI_CreateJavaVM方法,打上断点:


打断点

点击运行:


运行

出现了一个SIGSEGV错误:


SIGSEGV错误

在左下角的命令行里面执行命令:

process handle SIGSEGV --stop=false
修复bug

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


ojbk

到这一步,我们成功在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的周期。本质上就是这个线程来调度的;

其他的就不认识了。

我的公众号:


白玉京过客

相关文章

网友评论

    本文标题:Xcode debug Hotspot(一)——创建Xcode项

    本文链接:https://www.haomeiwen.com/subject/ebpbcqtx.html