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项目

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

C++


创建的项目形如:

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

新项目

把原本的文件都删掉:

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

空项目

修改运行目标

首先调出schema窗口

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

Schema路径


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

build

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

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

删除后的build

而后修改运行目标:

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

运行目标


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

选择文件


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

修改后运行目标

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

导入源码

把hotspot的源码导入项目:

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

导入源码

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

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

选择HotSpot源码

开始debug

找到jni.cpp:

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

jni.cpp

找到JNI_CreateJavaVM方法,打上断点:

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

打断点

点击运行:

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

运行

出现了一个SIGSEGV错误:

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

SIGSEGV错误

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

process handle SIGSEGV --stop=false

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

修复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项目的主要内容,如果未能解决你的问题,请参考以下文章

Debugging the Java HotSpot VM

UTF-8字符集在Windows Hotspot JVM 1.8.0_201中输出无效编码

Xcode:运行 XC 单元测试时,模块名称“”不是有效标识符

XCode 6 和不带 XC 的 Ad-Hoc 分发:配置

QT debug执行exe文件 应用程序无法正常启动0xc000007b

Xcode:如何创建 dSym 并仍然剥离符号?