如何对远程jar包进行Debug?

在现实开发过程中,现场环境永远比开发环境复杂,如果开发环境无法还原现场问题,就需要开发人员远程调试现场问题,接下来,本人基于网上讲解以及自己的理解完成远程调试Jar包,本文主要方便自己后续可以阅读。

1. 环境介绍

开发工具 intellij idea
语言 Java
项目管理工具 maven

 

2. 程序准备

本人准备了一个HelloWord程序,里面主要主要有一个线程一直在执行,本人主要就是在该线程中的关键程序语句加断点(方便实现远程调试)。源代码如下所示

package com.wxt;


import java.util.Date;

public class Main {

    public static void main(String[] args) {
        System.out.println("start debug");
        System.out.println(new Main().sayHello());
        new DebugThread().start();
    }


    public String sayHello(){
        return "say Hello";
    }
}

class DebugThread extends Thread{
    @Override
    public void run() {
        while (true){
            System.out.println("this day is "+new Date());//断点处
        }
    }
}

现需要对源代码使用Maven工具进行打包(生成Jar包),生成Jar 包完成后,由于本文使用了Maven中的maven-shade-plugin(指定运行的主方法Main)插件完成打包,打包完成的结构如下:

3. 远程调试

3.1. 服务器运行环境(现场环境)命令

java -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=y -jar remoteTest-1.0-SNAPSHOT.jar

-Xdebug:通知JVM工作在debug模式下;

-Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境;

transport:监听Socket端口连接方式(也可以dt_shmem共享内存方式,但限于windows机器,并且服务提供端和调试端只能位于同一台机);

server:server=y表示当前是调试服务端,=n表示当前是调试客户端;

suspend:suspend=n表示启动时不中断,一般用于设置主动连接;suspend=y表示启动时就进入调试模式,一般用于被动连接;关于suspend多说一句,如果设置为y,它会阻塞程序运行,直到有客户端连接到对应的监听端口(这里是9527),程序才真正开始执行。我们有时候会抱怨程序一闪而过,还没来得及在本地加载上代码程序就执行完了,这种情况就可以使用suspend参数。

现场启动成功界面:

3.2. 本地添加

添加路径:Intellij Idea界面的Run/Debug左边是配置运行的Edit Configuration,然后点击添加Remote运行环境的相关参数,参数示例如下图所示,点击保存然后运行就可连接现场。由于我们在现场环境运行的参数里面suspend=y表示启动时就进入调试模式,一般用于被动连接,因此我们客户端主动连接才会运行。

如何对远程jar包进行Debug?_第1张图片

你可能感兴趣的:(java笔记)