zoukankan      html  css  js  c++  java
  • 本地调试和远程调试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:IdeaProjectsmaven-hello-worldlibares-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,就可以成功调试了!

  • 相关阅读:
    bzoj 1367
    codeforces 757F
    bzoj 3600
    比赛环境设置
    线段树合并
    BZOJ2105: 增强型LCP
    BZOJ3156: 防御准备
    BZOJ3252: 攻略
    BZOJ2464: 中山市选[2009]小明的游戏
    Beta Round #9 (酱油杯noi考后欢乐赛)乌鸦喝水
  • 原文地址:https://www.cnblogs.com/kendoziyu/p/15181039.html
Copyright © 2011-2022 走看看