学习源码第一步就是搭建调试环境,可是看了网上大部分Elasticsearch调试方式都是配置各类环境变量而后直接启动Main方法,并且还各类报错。今天提供新的方式--remote debug来避免这些麻烦。html
首先要安装jdk8,gradle和Intellij IDEAjava
拉取代码,checkout到想要调试的版本(这里切到v6.1.0,须要注意的是不一样ES分支对gradle版本要求不同,能够到README文件中查看对应到gradle版本要求)git
git clone git@github.com/elastic/elasticsearch cd elasticsearch git checkout v6.1.0
执行gradle idea,成功后会提示BUILD SUCCESSFUL,而后导入到IDEAgithub
:test:fixtures:hdfs-fixture:idea :test:fixtures:krb5kdc-fixture:ideaModule :test:fixtures:krb5kdc-fixture:idea :test:fixtures:old-elasticsearch:ideaModule :test:fixtures:old-elasticsearch:idea BUILD SUCCESSFUL Total time: 2 mins 2.159 secs
gradle run --debug-jvm
执行成功后是这样的,其中8000就是远程debug端口架构
点击IDEA的Edit Configurations,再点击➕
填写主机和端口,Name是配置名称,能够自定义(我这里就填es),点OK保存配置
搜一下源码里面Elasticsearch类,,看到Main方法,先打个断点等会看效果
最后再点下绿色小虫子启动debug
是否是在断点停下来了
跳过断点再看下控制台,是否是启动日志都出来了
再验证下是否启动成功jvm
一切源于被称做 Agent 的东西。JVM有一种特性,能够容许外部的库(Java或C++写的libraries)在运行时注入到 JVM 中。这些外部的库就称做 Agents, 他们有能力修改运行中 .class 文件的内容。
这些 Agents 拥有的这些 JVM 的功能权限, 是在 JVM 内运行的 Java Code 所没法获取的, 他们能用来作一些有趣的事情,好比修改运行中的源码, 性能分析等。 像 JRebel 工具就是用了这些功能达到魔术般的效果。
传递一个 Agent Lib 给 JVM, 经过添加 agentlib:libname[=options] 格式的启动参数便可办到。像上面的远程调试咱们用的就是 -agentlib:jdwp=... 来引入 jdwp 这个 Agent 的。
jdwp 是一个 JVM 特定的 JDWP(Java Debug Wire Protocol) 可选实现,用来定义调试者与运行JVM之间的通信,它的是经过 JVM 本地库的 jdwp.so 或者 jdwp.dll 支持实现的。简单来讲, jdwp agent 会创建运行应用的 JVM 和调试者(本地或者远程)之间的桥梁。既然他是一个Agent Library, 它就有能力拦截运行的代码。
在 JVM 架构里, debugging 功能在 JVM 自己的内部是找不到的,它是一种抽象到外部工具的方式(也称做调试者 debugger)。这些调试工具或者运行在 JVM 的本地 或者在远程。这是一种解耦,模块化的架构。elasticsearch
关于Agent还有不少值得研究的细节,甚至基于JVMTI本身实现。参考https://www.ibm.com/developerworks/cn/java/j-lo-jpda2/index.htmlide