赞
踩
目录
对于分布式系统的调试不知道大家有什么好的方法。对于我来说,在知道远程调试这个方法之前就是在代码中打各种log,然后重新部署,上线,调试,这样比较费时,有什么更好的办法呢?
有时候,本地调试的时候没有问题,打包部署到测试环境的时候却爆出一堆莫名其妙的问题,这时该怎么办呢?
偶然间了解到的远程调试的功能简直是一把利器,能够非常好地解决上述问题,还不赶紧来了解一下?
要让远程服务器运行的代码支持远程调试,则启动的时候必须加上特定的JVM参数,这些参数是:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=${debug_port}
其中的${debug_port}
是用户自定义的,为debug端口,本例以5555
端口为例。
本人在这里踩过一个坑,必须要说一下。在使用公司内部的自动化部署平台NDP进行应用部署时,该平台号称支持远程调试,只需要在某个配置页面配置一下调试端口号(没有填写任何IP相关的信息),并且重新发布一下应用即可。事实上也可以发现,上述JVM参数中唯一可变的就是${debug_port}
。但是实际在本地连接时发现却始终连不上5555 的调试端口,仔细排查才发现,下面截取了NDP发布的应用所有JVM参数列表中与远程调试相关的JVM启动参数如下:
-Xdebug -Xrunjdwp:transport=dt_socket,suspend=n,server=y,address=127.0.0.1:5555
将address设置为127.0.0.1:5555
,表示将调试端口限制为本地访问,远程无法访问,这个应该是NDP平台的一个bug,我们在自己设置JVM的启动参数时也需要格外注意。
如果只是临时调试,在端口号前面不要加上限制访问的IP地址,调试完成之后,将上述JVM参数去除掉之后重新发布下,防范开放远程调试端口可能带来的安全风险。
打开Intellij IDEA,在顶部靠右的地方选择”Edit Configurations…”,进去之后点击+号,选择”Remote”,按照下图的只是填写红框内的内容,其中Name填写名称,这里为remote webserver
,host为远程代码运行的机器的ip/hostname,port为上一步指定的debug_port,本例是5555
。然后点击Apply,最后点击OK即可
现在在上一步选择”Edit Configurations…”的下拉框的位置选择上一步创建的remote webserver
,然后点击右边的debug
按钮(长的像臭虫那个),看控制台日志,如果出现类似“Connected to the target VM, address: ‘xx.xx.xx.xx:5555’, transport: ‘socket’”的字样,就表示连接成功过了。我这里实际显示的内容如下:
Connected to the target VM, address: '10.185.0.192:15555', transport: 'socket'
远程debug模式已经开启,现在可以在需要调试的代码中打断点了,比如:
如图中所示,如果断点内有√,则表示选取的断点正确。
现在在本地发送一个到远程服务器的请求,看本地控制台的bug界面,划到debugger这个标签,可以看到当前远程服务的内部状态(各种变量)已经全部显示出来了,并且在刚才设置了断点的地方,也显示了该行的变量值。
备注:需要注意的是,用于远程debug的代码必须与远程部署的代码完全一致,不能发生任何的修改,否则打上的断点将无法命中,切记切记。
首先,了解下Java程序的执行过程- 分为以下几个步骤:Java的文件 - - 编译生成的类文件(class文件) - - JVM加载类文件 - - JVM运行类字节码文件 - - JVM翻译器翻译成各个机器认识的不同的机器码。
众所周知,Java 程序是运行在Java 虚拟机(JVM )上的,具有良好跨平台性,是因为Java程序统一以字节码的形式在JVM中运行,不同平台的虚拟机都统一使用这种相同的程序存储格式。因为都是类字节码文件,只要本地代码和远程服务器上的类文件相同,两个JVM通过调试协议进行通信(例如通过插座在同一个端口进行通信),另外需要注意的时,被调试的服务器需要开启调试模式,服务器端的代码和本地代码必须保持一致,否则会造成断点无法进入的问题。
这个架构其实质还是JVM,只要确保本地的Java的源代码与目标应用程序一致,本地的Java的源码就可以用插座连接到远端的JVM,进而执行调试。因此,在这种插座连接模式(下文介绍)下,本地只需要有源码,本地的Java的应用程序根本不用启动。
传输方式,默认为Socket ;
套接字:MACOS,Linux的系统使用此种传输方式;
共享内存:WINDOWS系统使用此种传输方式。
调试模式,默认为Attach ;
Attach :此种模式下,调试服务端(被调试远程运行的机器)启动一个端口等待我们(调试客户端)去连接;
Socket :此种模式下,是我们(调试客户端)去监听一个端口,当调试服务端准备好了,就会进行连接。
1. idea的的服务的开启调试模式设置详细说明
文本:
CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8089"
2. 各参数解释:
3.IDEA设置远程属性说明,以下为谷歌翻译
Java
远程调试的原理是两个VM
之间通过debug
协议进行通信,然后以达到远程调试的目的,两者之间可以通过socket
进行通信;
我们知道,Java 程序都是运行在 Java虚拟机上的,我们要调试 Java程序,事实上就需要向 Java 虚拟机请求当前运行态的状态,并对虚拟机发出一定的指令,设置一些回调等等,那么Java的调试体系,就是虚拟机的一整套用于调试的工具和接口。
对于 Java 虚拟机接口熟悉的人来说,您一定还记得 Java 提供了两个接口体系:
JPDA
( Java
平台调试体系)模块层次:
举个例子:客户端(idea 、eclipse 等)之所以可以进行调试,是由于客户端 和 服务端(程序端)进行了 socket 通信,通信过程如下:
先建立起了 socket连接
换句话说,通过JPDA这套接口,我们就可以开发自己的调试工具
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。