美文网首页
使用JDWP远程调试java程序

使用JDWP远程调试java程序

作者: 方雲 | 来源:发表于2019-04-25 18:26 被阅读0次

    前言

    线上服务器出现的bug,因为各种复杂环境的原因,经常会很难在本地调试,只能到处打log减少重启次数。一直有听说有远程调试这玩意,因为使用场景不多+懒惰一直没去调研,最近终于在一门课程上面揭开了远程调用的面纱,记录一下。

    简介

    JDWP(Java Debug Wire Protocol)我倾向于翻译为java调试传输协议,即调试器与目标java程序之间的传输协议。JVM自带有对这个协议相应的支持,通过下面的命令可以查看help文档。

    /Users/user$  java -agentlib:jdwp=help
                   Java Debugger JDWP Agent Library
                   --------------------------------
    
      (see http://java.sun.com/products/jpda for more information)
    
    jdwp usage: java -agentlib:jdwp=[help]|[<option>=<value>, ...]
    
    Option Name and Value            Description                       Default
    ---------------------            -----------                       -------
    suspend=y|n                      wait on startup?                  y
    transport=<name>                 transport spec                    none
    address=<listen/attach address>  transport spec                    ""
    server=y|n                       listen for debugger?              n
    launch=<command line>            run debugger on event             none
    onthrow=<exception name>         debug on throw                    none
    onuncaught=y|n                   debug on any uncaught?            n
    timeout=<timeout value>          for listen/attach in milliseconds n
    mutf8=y|n                        output modified utf-8             n
    quiet=y|n                        control over terminal messages    n
    
    Obsolete Options
    ----------------
    strict=y|n
    stdalloc=y|n
    
    Examples
    --------
      - Using sockets connect to a debugger at a specific address:
        java -agentlib:jdwp=transport=dt_socket,address=localhost:8000 ...
      - Using sockets listen for a debugger to attach:
        java -agentlib:jdwp=transport=dt_socket,server=y,suspend=y ...
    
    Notes
    -----
      - A timeout value of 0 (the default) is no timeout.
    
    Warnings
    --------
      - The older -Xrunjdwp interface can still be used, but will be removed in
        a future release, for example:
            java -Xdebug -Xrunjdwp:[help]|[<option>=<value>, ...]
    
    

    接下来讲下具体怎么使用。

    目标java程序开启jdwp的监听

    增加jvm参数,然后重启java进程

    -agentlib:jdwp=transport=dt_socket,server=y,address=8000
    

    即使用socket模式在8000端口监听等待jdwp的客户端,这个客户端就是后文的调试器。
    重启之后程序会卡在那里等待有调试器连接之后才会继续启动程序。

    • PS:jvm参数在spring boot项目和tomcat项目怎么加自行google,此处不累赘。
    • PPS:服务器端口开放就不用说了,确定能telnet通再继续下一步吧。

    使用IDEA作为调试器(eclipse操作几乎一样)

    点击运行设置下拉选项
    点击Edit Configurations...
    弹出窗口中点击左上角的+号,然后选择Remote
    设置调试器连接目标程序
    保存设置之后,点击Debug

    连接成功以后,目标程序就会继续启动,然后你就可以在IDE上面给远程的程序打断点了。

    相关文章

      网友评论

          本文标题:使用JDWP远程调试java程序

          本文链接:https://www.haomeiwen.com/subject/qswzgqtx.html