开发后台程序的时候,有一个苦恼就是在开发环境下一切正常,但是到了运行环境就出现了问题。特别是开发是在window,但是运行环境是Linux。而且是一些通过log file看不出的问题。debug无疑是最方便快捷的方式。那么如何通过intellij对运行在server端的代码进行调试呢.
Intellij的官方文档有给很详细的解释,但是有些地方并未做很好的解释。
https://www.jetbrains.com/help/idea/tutorial-remote-debug.html#e4b32822
所以在这里我结合官方文档和自己的一些经验介绍以下如何做到这个远程调试:
- 首先第一步就是,要有一个需要调试的程序
- 创建一个新的remote jvm Debug
通过主菜单中的Run|Edit Configurations来到在下面的窗口,点击+键,创建一个新的Remote JVM Debug
然后得到下面的信息
其中对我们来说最重要的是Host和command line argruments for remote JVM.
Host
host的默认值是localhost,就是本机。就是说如果是本机debug这里就不需要修改了。因为我们今天要说的是远程调试,所以这里就添加上你程序运行的服务器的ip地址
command line argruments for remote JVM 远程JVM的命令行参数
这段命令代码是用来连接debugger和运行的java进程的。其中的transport是必须定义项
其中jdwp是java Debug Wire Protocol,是java debug的协议。
设置好了,之后点击apply就可以了
- 将command line argruments for remote JVM复制到你启动程序的机制中。
这里重点提以下suspend参数,因为我使用默认的参数设定,一直和server端的程序连不上
suspend在这里默认的值是suspend=n.然而直接用这个默认的值,有的时候会出现异常。因为网络原因没有马上连上,程序就以为time out,没有debugger要来链接,就断开了。所以这个最好设置为suspend=y,这样就是强制server端的程序等到与intellij的debugger建立连接后才开始运行
比如我的例子是用shell script启动的程序,所以就将这段代码添加到shell中。其实用什么启动程序重要的,是在java -jar 之后,自己的jar名称之前添加上这段代码就可以了.
java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 remote-debug.jar
- 启动debugger
因为我们suspend的参数设置为y,所以sever端的程序一定会等到我们的debugger连入才会运行。因为我们可以先启动server端的程序,然后在启动我们在intellij上的远程debugger。
首先设置自己的break point。这样程序才会在运行的时候暂定,进入debug模式。
在下拉框中选定你自己创建的demote debugger然后点击绿色的debug按钮。就开始建立连接啦
当在console栏出现下面的文字,就是remote debug连接成功,你就可以开始debug了
另外还要说一个小的知识点:
我现在用的还是jdk8.
如果你用的是java9或是java9以上的版本,因为从java9 JDWP就是我们上面说的java debug协议做出了改动。所以command line就会做出相应的调整,如下面的代码:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:8000
谢谢你今天来。希望我的经验能帮到你。



