本地调试和远程调试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包
推荐一个软件,帮你实现本地计算机和服务器之间的文件互传:
- Host Name 填写服务器的 ipv4 地址;
- Username 和 password 和登录 XShell 时输入的一样;
- 最后点击 Login 即可;
如果需要指引,可以考虑查看这篇 《使用WinScp连接远程服务器和传输文件》
2.Windows上运行,并用IDEA本地调试
-
首先创建一个 Maven 项目,可以参考《使用IntelliJ IDEA开发Maven HelloWorld》
-
接着,运行 MavenHelloWorld:
-
接着,在项目中创建 lib 文件夹,并把从服务器上下载的 jar 包放进去:
-
右击你的 jar,选择
Add As Library...
,弹出一个对话框,直接确定。现在,jar包前面多出一个小三角,点击它就可以展看察看反编译的源码了:
-
点击 Edit Configuration...,修改 VM Options,加上参数
-javaagent:D:\IdeaProjects\maven-hello-world\lib\ares-agent.jar
:
-
接着,在 premain 方法上加上断点:
-
最后,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包:
3.2 在Linux上启动
-
首先,借助 WinSCP 把 maven-hello-world.jar 上传到服务器的
/home/用户名
文件夹下:
-
在用 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上调试
-
点击 Edit Configuration...,添加如图所示的 Remote :
-
Debug MavenHelloWorldRemote,就可以成功调试了!