Xcode debug Hotspot——创建Xcode项目
Posted 沙雕程序猿的日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode debug Hotspot——创建Xcode项目相关的知识,希望对你有一定的参考价值。
概述
前面安装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项目的主要内容,如果未能解决你的问题,请参考以下文章
UTF-8字符集在Windows Hotspot JVM 1.8.0_201中输出无效编码
Xcode:运行 XC 单元测试时,模块名称“”不是有效标识符