最近在学习Java Agent,记录一下如何调试。
一、写一个Agent
1、编写一个Java类,并包含如下两个方法中的任一个:
public static void premain(String agentArgs, Instrumentation inst); //【1】
public static void premain(String agentArgs); //【2】
其中,【1】和【2】同时存在时,【1】会优先被执行,而【2】则会被忽略。
具体使用如下代码:
import ;
public class MyAgent {
public static void premain(String agentArgs, Instrumentation inst) {
System.out.println("this is an agent.");
System.out.println("args:" + agentArgs + "\n");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
2、jar打包
在代码的resources目录下添加META-INF/文件。其目的是指定Premain-Class的类。
Manifest-Version: 1.0
Premain-Class: .
Can-Redefine-Classes: true
- 1
- 2
- 3
3、在中配置打包的相关配置。
<packaging>jar</packaging>
<build>
<finalName>my-agent</finalName>
<plugins>
<plugin>
<groupId></groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<index>true</index>
<manifestFile>
src/main/resources/META-INF/
</manifestFile>
<manifest>
<addDefaultImplementationEntries/>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId></groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
最后,执行mvn clean package,就能生成一个。
二、运行Agent
新建一个测试类。如下:
public class AgentTest {
public static void main(String[] args) {
System.out.println("this is main");
}
}
- 1
- 2
- 3
- 4
- 5
命令行运行:java -javaagent: 文件位置 [=参数]
idea运行:如果是Idea中,按如下配置。
运行结果如下:我这里重复加载了两次Agent,但是传入的参数不同。
this is an agent.
args:first
this is an agent.
args:second
this is main
- 1
- 2
- 3
- 4
- 5
- 6
- 7
三、调试Agent
1、使用 Spring Boot 创建一个简单的 Web 项目。AgentDemo用户创建Agent类,agent-test用于外部启动执行Agent类,如下图 :
友情提示 :这里一定要注意下。创建的 Web 项目,使用 IntelliJ IDEA 的菜单 File / New / Module 或 File / New / Module from Existing Sources ,保证 Web 项目和 Agent 项目平级。这样,才可以使用 IntelliJ IDEA 调试 Agent 。
2、设置线程模式下的断点
3、执行
运行 Web 项目的 Application 的 #main(args) 方法,并增加 JVM 启动参数,-javaagent:F:\IdeaWorkSpace\AgentDemo\target\。如下图 :
debug模式运行就可以顺利调试agent代码了。