jvm之远程调试

这篇具有很好参考价值的文章主要介绍了jvm之远程调试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面

工作中,有时会出现测试环境有问题,本地却正常的情况,此时我们就可以通过JVM提供的远程调用的功能,实现在本地debug调试测试环境代码。

1:例子1直接运行class

首先我们来定义类:

package com.feng.map.demo;
import java.util.*;

public class MapMain {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("aa", "aa");
        map.put("bb", "bb");
        map.put("cc", "cc");
        map.put("dd", "dd");
        map.put("ff", "f");
 
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        for (Map.Entry<String, String> entry : entrySet) {
            System.out.println(entry.getKey() + " ------ " + entry.getValue());
        }
    }
}

接着使用如下命令启动,开启JVM远程debug接口:

D:\test>javac -d . MapMain.java

D:\test>java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9093 com.feng.map.demo.MapMain
Listening for transport dt_socket at address: 9093

这样当前启动的JVM虚拟机就会通过9093端口来监听服务调用了,接着我们配置idea的remote debug功能,如下:

jvm之远程调试

然后我们运行上图配置的remotemap,就可以进行调试远端代码了,如下:

jvm之远程调试

2:运行jar

自己准备一个可以执行的jar包,我这里是一个基于springboot的项目,如下方式启动:

D:\test>D:\\program_files\\jdk-17.0.1\\bin\\java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=9093 pricing-0.0.1-SNAPSHOT.jar
Listening for transport dt_socket at address: 9093
11:25:40,036 |-INFO in ch.qos.logback.classic.LoggerContext[default] - This is logback-classic version 1.4.5
11:25:40,059 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
11:25:40,061 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
11:25:40,063 |-INFO in ch.qos.logback.classic.BasicConfigurator@1165b38 - Setting up default configuration.
11:25:40,694 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@4c12331b - URL [jar:file:/D:/test/pricing-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/logback-boot.xml] is not of type file
...

然后在idea中配置远程关联到本地源码,从而在本地debug,如下:

jvm之远程调试

然后我们在想要debug的位置打上断点,如下:

jvm之远程调试

接着访问远端服务器接口,就可以开始debug本地的代码了,如下:

jvm之远程调试

3:部署到Tomcat

参考这篇文章 准备测试项目,之后先使用idea启动,之后会在CATALINA_BASE中生成项目对应的war的解压包,接下来我们测试如下命令是否能够启动注意你本地目录和我不一样

set "CATALINA_BASE=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_test-remote-debug_2" && set "CATALINA_HOME=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66" && set "CATALINA_TMPDIR=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\temp" && set "JRE_HOME=D:\program_files\jdk1.8.0_202" && set "CLASSPATH=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\bin\bootstrap.jar;D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\bin\tomcat-juli.jar" && D:\\program_files\\apache-tomcat-8.5.66-windows-x64_tmp\\apache-tomcat-8.5.66\\bin\\catalina.bat run

这样就说明我们配置成功了,之后我们需要配置Tomcat启动的时候启用远程debug的能力,打开catalina.bat搜索if not ""%1"" == ""run"" goto mainEntry在其上增加如下内容:

SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000

接着使用上述命令启动,输出如下内容则说明配置成功:

C:\Windows\System32>set "CATALINA_BASE=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.2\tomcat\Unnamed_test-remote-debug_2" && set "CATALINA_HOME=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66" && set "CATALINA_TMPDIR=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\temp" && set "JRE_HOME=D:\program_files\jdk1.8.0_202" && set "CLASSPATH=D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\bin\bootstrap.jar;D:\program_files\apache-tomcat-8.5.66-windows-x64_tmp\apache-tomcat-8.5.66\bin\tomcat-juli.jar" && D:\\program_files\\apache-tomcat-8.5.66-windows-x64_tmp\\apache-tomcat-8.5.66\\bin\\catalina.bat run
...
Using CATALINA_OPTS:   "-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000"
Listening for transport dt_socket at address: 8000
05-May-2023 13:56:25.016 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.服务器版本: Apache Tomcat/8.5.66
...

然后配置JVM remote,如下:

jvm之远程调试

写在后面

参考文章列表

tomcat intellij远程调试 。

JVM远程调试功能开启,与原理 。

springmvc之编程步骤 。文章来源地址https://www.toymoban.com/news/detail-434687.html

到了这里,关于jvm之远程调试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • shell 拼接字符串,出现后面的字符串覆盖前面的字符串问题

    shell 拼接字符串语法很简单两个参数并排前后写上接口,如下 str1=www str2=bbb s t r 1 str1 s t r 1 str2 的结果未 wwwbbb 有时会出现如下问题: 在拼接字符串的时候,后面的字符串将前面的字符串覆盖了。 shell的内容如下: #!/bin/bash date_str=“ date +%Y%m%d ” echo $date_str python_file_name=\\\" 1

    2024年02月09日
    浏览(54)
  • 如何在Linux部署MeterSphere并实现公网访问进行远程测试工作

    MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能,全面兼容 JMeter、Selenium 等主流开源标准,有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试,加速高质量的软件交付,推动中国测试行业整体效率的提升。 下面介

    2024年04月15日
    浏览(48)
  • Pycharm 远程连接docker进行远程调试,ssh测试可连接,但是sftp连接不上的问题

    docker端口配置映射都正确,自己的xshell可以成功连接,使用Pycharm就是sftp连接不上,一直在等待。ssh解释器里显示是连接成功的,但是整个配置到sftp里却是连接失败。删除本机的known_hosts文件、删除重启pycharm、重启电脑、关机重开都不行,以为是sftp的问题,但是发现xftp软件

    2024年02月04日
    浏览(60)
  • VS2019 莫名其妙出现: C2059 语法错误:“}“,C2143 语法错误:缺少“;“(在“}“的前面),C2065 未定义标识符,C2039 不是““的成员等

    一、问题 VS2019 莫名其妙出现: C2059 语法错误:\\\"}\\\" C2143 语法错误:缺少\\\";\\\"(在\\\"}\\\"的前面) C2447    “{”: 缺少函数标题(是否是老式的形式表?) C2065 未定义标识符 C2039 \\\"\\\"不是\\\"\\\"的成员 等错误,看代码其实完全没有任何问题,究竟是怎么回事呢?  二、解决办法 找到相关行附近的注

    2024年02月06日
    浏览(94)
  • JVM工作的总体机制概述

    JVM:Java Virtual Machine,翻译过来是Java虚拟机 JRE:Java Runtime Environment,翻译过来是Java运行时环境 JRE=JVM+Java程序运行时所需要的类库 JDK:Java Development Kits,翻译过来是Java开发工具包 JDK=JRE+Java开发辅助工具 Java源程序→编译→字节码文件→放到JVM上运行 总体机制的粗略描述:

    2024年02月13日
    浏览(39)
  • JVM哪些区域会出现内存溢出

    JVM(Java Virtual Machine)是指Java虚拟机,是一种可以在不同平台上运行Java字节码的虚拟计算机。JVM是Java语言的核心,通过将Java代码编译成字节码并在JVM上运行,实现了跨平台的特性。 1.方法区(Metaspace) 方法区用于存储类的信息、静态变量和常量等数据。在JDK8及以上版本中

    2024年02月08日
    浏览(47)
  • JVM工作原理与实战(二十一):内存管理

    JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、不同语言的内存管理 1.C/C++的内存管理 2.Java的内存管理 二、垃圾回收的对比 1.自动垃圾回收与手动垃圾回收的对比 2.优点与缺点 总结 JVM作为Java程序的运行环境,其负责解释和执行字节码,管理

    2024年01月21日
    浏览(45)
  • JVM笔记 —— 出现内存溢出错误时时如何排查

    内存溢出错误分为StackOverflowError和OutOfMemoryError,前者是栈中出现溢出,后者一般是堆或方法区出现溢出,简称OOM 1. 栈溢出 StackOverflowError 栈溢出一般都是因为没有正确的结束递归导致的,无限递归导致超出栈内存(-Xss)限制时就会抛出StackOverflowError。这种情况直接根据异常

    2024年02月13日
    浏览(42)
  • 字节码调试的入口 —— JVM 的寄生插件 javaAgent 那些事

    Java Instrumentation 这个技术看起来非常神秘,很少有书会详细介绍。但是有很多工具是基于 Instrumentation 来实现的: APM 产品: pinpoint、skywalking、newrelic、听云的 APM 产品等都基于 Instrumentation 实现 热部署工具:Intellij idea 的 HotSwap、Jrebel 等 Java 诊断工具:Arthas、Btrace 等 由于对字

    2024年02月13日
    浏览(43)
  • “深入探索JVM:解密Java虚拟机的工作原理“

    标题:深入探索JVM:解密Java虚拟机的工作原理 摘要:Java虚拟机(JVM)是Java语言的核心,它负责将Java代码转换为可执行的机器码。本文将从内存管理、垃圾回收、即时编译等方面深入探索JVM的工作原理,并提供示例代码来帮助读者更好地理解。 正文: 一、内存管理 JVM通过

    2024年02月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包