• 【从零单排】Java远程调试Remote Debug的二三事


    问题

    笔者对于本地调试已经有很多经验了,一般流程是:在IDE中设置断点,配置参数,开始调试。这里的程序是跑在本地的机器上的。

    而在实际开发或者生产环境中,应用都是部署在某个服务器上的,服务器上的机器性能更强大,而且可以起集群协同处理。

    由于本地的机器的资源限制(笔者的台式机6核16G内存),对于大型应用来说远远不够,某些时候为了跑UAT测试,必须把应用部署到远端的服务器上,这个时候就需要远程调试了。

    命令

    远程调试和本地调试的思路是一致的,唯一的区别就是,需要让IDE attach到远端服务器的应用上去。

    这里有个前提就是,在起JVM的时候,必须设置使其支持远程调试,命令如下(JDK 1.5 +):

    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060
    

    参数的含义如下:

    • jdwp:加载JDWP的JPDA参考执行实例。
    • transport:用于在调试程序和 VM 使用的进程之间通讯。
    • dt_socket:套接字传输。
    • server=y/n:VM 是否需要作为调试服务器执行。
    • address=6060:调试服务器的端口号,客户端用来连接服务器的端口号。
    • suspend=y/n:是否在调试客户端建立连接之后启动 VM 。

    对于JDK 1.4及以下的,参数略微有所区别。

    一般来说,需要改动的是address,且需要确保该端口在服务器上是可用的,没有冲突。

    验证

    将应用正确在服务器上部署好之后,使用ps -aux | grep java命令可以查看server上的Java应用,找到我们的应用如下:

    /opt/sunjdk/jdk1.8.0u45_64/bin/java 
    -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=6060 
    -XX:+UseG1GC -Xmx140G -Xms5G -Xss10M -XX:NewSize=4G -Dcom.nomura.fixp.watchdog.timeout.minutes=30 
    -verbose:gc 
    -Xloggc:/home/user1/LOGS/app_log.log
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -Dcom.sun.management.jmxremote.port=1785
    -Dcom.sun.management.jmxremote.authenticate=false 
    -Dcom.sun.management.jmxremote.ssl=false 
    -Dlog4j.configuration=file:///home/user1/App/resources/log4j.properties
    -cp path1:path2:path3 com.dummy.App
    

    可以看到启动参数中已经正确设置了远程调试。

    连接

    接下来,我们就需要在IDE中,连接到这个端口。在IntelliJ中,配置如下:

    debug_1.png

    这里需要我们填的是Host和Port。

    然后,就可以愉快地跑起来了~

    需要注意的是,远程调试由于需要网络传输,如果服务器在国外,可能会非常慢。

    参考

  • 相关阅读:
    深度学习3--caffe的安装(only CPU)
    深度学习2--安装opencv3.1
    深度学习1--ubuntu14.04+win10双系统
    java回调机制——基本理解
    mysql修改默认端口号后从windows命令行登录
    UTF-8编码与GBK编码下的字符长度
    代码质量的几点新思考
    软件工程质量之“工程元数据”
    Junit概述
    maven+springmvc项目启动时,request mapping not found……
  • 原文地址:https://www.cnblogs.com/maxstack/p/12877974.html
Copyright © 2020-2023  润新知