arthas-agent的源码调试

58 阅读1分钟

启动 debug远程模式

打开源码的math-game模块并启动jar

image.png

image.png

本地启动math-game模块

image.png

启动arthas即可进入断点

image.png

arthas-agent 调试源码讲解步骤

  • 解析参数获取agent-core的路径

  • 根据路径创建自定义的类加载器

  • 开启一个单独的线程去bind,通过反射调用ArthasBootstrap.getInstance方法

按照上面三个步骤逐步分析:

主要代码逻辑都在AgentBootstrap 中,开始分析的地方:

image.png

decode 以后的arthas

image.png

/Users/jlgl/.arthas/lib/4.0.1/arthas/arthas-core.jar;
;
arthasAgent=/Users/jlgl/.arthas/lib/4.0.1/arthas/arthas-agent.jar;
arthasCore=/Users/jlgl/.arthas/lib/4.0.1/arthas/arthas-core.jar;
javaPid=46335;
1. 解析参数获取agent-core的路径:

/Users/jlgl/.arthas/lib/4.0.1/arthas/arthas-core.jar

2. 根据路径创建自定义的类加载器
arthasClassLoader = new ArthasClassloader(new URL[]{arthasCoreJarFile.toURI().toURL()});
3. 开启一个单独的线程去bind,通过反射调用ArthasBootstrap.getInstance方法

Thread bindingThread = new Thread() {
    @Override
    public void run() {
        try {
            bind(inst, agentLoader, agentArgs);
        } catch (Throwable throwable) {
            throwable.printStackTrace(ps);
        }
    }
};

bindingThread.setName("arthas-binding-thread");
bindingThread.start();
bindingThread.join();

拓展

URLClassLoader 的用法

arthasCoreJarFile.toURI().toURL()
file:/Users/jlgl/.arthas/lib/4.0.1/arthas/arthas-core.jar