本地调试和远程调试javaagent的premain方法

问题背景

现在,公司前人写的 javaagent 类型的 jar 包。线上的Web应用服务器,正常使用该 jar 包,现在我因为某些原因,需要调试其代码。

比如,你通过 XShell 登录测试环境的服务器,执行以下命令:

ps -ef | grep java | grep -v grep

然后,我们在一大串 JVM Options 中找到 -javaagent:/path/for/javaagent/ares-agent.jar,这个 jar 就是我想要调试的项目,我们该怎么办呢?

1.从服务器下载jar包

推荐一个软件,帮你实现本地计算机和服务器之间的文件互传:

Go to download WinSCP

  • Host Name 填写服务器的 ipv4 地址;
  • Username 和 password 和登录 XShell 时输入的一样;
  • 最后点击 Login 即可;

如果需要指引,可以考虑查看这篇 《使用WinScp连接远程服务器和传输文件》

2.Windows上运行,并用IDEA本地调试

  1. 首先创建一个 Maven 项目,可以参考《使用IntelliJ IDEA开发Maven HelloWorld》

  2. 接着,运行 MavenHelloWorld:

  3. 接着,在项目中创建 lib 文件夹,并把从服务器上下载的 jar 包放进去:

  4. 右击你的 jar,选择 Add As Library...,弹出一个对话框,直接确定。现在,jar包前面多出一个小三角,点击它就可以展看察看反编译的源码了:

  5. 点击 Edit Configuration...,修改 VM Options,加上参数-javaagent:D:\IdeaProjects\maven-hello-world\lib\ares-agent.jar

  6. 接着,在 premain 方法上加上断点:

  7. 最后,Debug MavenHelloWorld:

你就可以在本地调试你的 javaagent 项目的 premain 方法了。

3. Linux上运行,并用Idea远程调试

有些代码,本地缺少环境,只能在服务器上运行才能更具象。

3.1 打包可执行jar

首先,我需要把这个 MavenHelloWorld 打包成一个可执行的 jar 包,因此,我修改 pom.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.tedu</groupId>
    <artifactId>maven-hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <finalName>maven-hello-world</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <!--指定 Main-Class 来指定可运行 jar 的主类 -->
                        <manifest>
                            <mainClass>cn.tedu.MavenHelloWorld</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

接着,进行打包,约等于命令 mvn package:

然后,我就得到了打包好的可执行jar包:

参考自《使用Maven打包可运行jar和javaagent.jar的区别》

3.2 在Linux上启动

  1. 首先,借助 WinSCP 把 maven-hello-world.jar 上传到服务器的 /home/用户名 文件夹下:

  2. 在用 XShell 执行命令 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005 -javaagent:/path/for/javaagent/ares-agent.jar -jar maven-hello-world.jar

关键点:suspend=y,这样就可以等待远程调试程序的启动。

3.3 在 Windows的Idea上调试

  1. 点击 Edit Configuration...,添加如图所示的 Remote :

  2. Debug MavenHelloWorldRemote,就可以成功调试了!

posted @ 2021-08-24 16:40  极客子羽  阅读(2938)  评论(0编辑  收藏  举报