本地调试和远程调试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 @   极客子羽  阅读(3065)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2020-08-24 Spring是如何解决循环依赖的?
点击右上角即可分享
微信分享提示