当前位置: 首页 > 后端技术 > Java

IDEA实现远程DEBUG调试《兄弟来了~~》

时间:2023-04-01 22:01:53 Java

说明:这里主要介绍如何通过IDEA开发工具实现远程DEBUG调试。开发环境:JDK8开发工具:IDEA20191.什么是远程DEBUG调试?通俗地说,remoteDEBUG就是在本地环境下了断点,但是代码却在远端运行。2、为什么要使用远程DEBUG?一般我们写好代码后,会先在本地进行接口自测。如果发现问题,可以直接开启DEBUG模式进行定位、排查和解决问题。但是有时候,本地自测没问题,但是测试环境和生产环境就出问题了。“这个……我本地测试确实没问题……”“你要是敢狡辩就给我查一下,查不出来……”自从什么时候出了问题出现了,想办法解决。但是问题出现在线上,本地无法重现...有时无法查看日志...怎么回事?别担心,别担心!这不,远程DEBUG来了,他来了!!!3、远程DEBUG实现原理实现原理:Debugger和TargetVM运行在各自的进程中,它们之间的通信协议是JDWP。JDWP(JavaDEbuggerWireProtocol):JavaDebuggingWireProtocol,是为Java调试而设计的通信交互协议,定义了调试器(如:IDEA工具)和被调试程序(运行在服务器虚拟机中的程序)之间传递的信息的格式。通过该协议,Debugger终端(本地)可以与目标VM(服务器上运行的程序)通信,可以获取目标VM的类、对象、线程等信息。JVM本身提供了调试工具JDB,支持设置断点和线程级调试。不同的JVM通过接口协议进行通信,使本地环境可以与远程JVM建立联系和通信。和IDEA一样,Eclipse只支持这一层。4、如何在IDEA中实现远程DEBUG?4.1.在POM依赖项中配置jvmArguments。[jvmArguments]配置需要添加到spom依赖中。添加此配置后,将打包后的项目发布到服务器,可以支持远程DEBUG。具体操作如下:,address=5005,server=y,suspend=n具体参数详解:[-Xdebug]:通知JVM工作在DEBUG模式。[-Xrunjdwp]:指示JVM使用(Javadebugwireprotocol)运行调试环境。[transport]:指定调试数据的传输方式,dt_socket指的是SOCKET方式,dt_shmem指的是共享内存方式。据说:dt_shmem只适用于Windows平台。[地址]:调试服务器的端口号,客户端连接服务器使用的端口号(一般工具默认端口为5005)。[server=y/n]:VM是否需要作为调试服务器执行(选择y)。【suspend=y/n】:调试客户端建立连接后是否启动VM。4.2.创建一个JAR包。jar包在目标目录:4.3。部署JAR运行时配置参数。jar文件上传到服务器后,运行jar文件需要配置参数。执行如下命令:nohupjava-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005-jartest-0.0.1-SNAPSHOT.jar&JDK版本不同,JVM参数也不同(有兴趣自行理解),这里以jdk8版本为例进行远程调试。关于-agentlib:JavaAgent(Java探针),在JDK1.5中引入,是一种可以动态修改Java字节码的技术。Java类编译完成后,形成字节码,由JVM执行。JVM在执行字节码之前,获取字节码信息,通过字节码转换器修改字节码,指定一些功能。比如常见的java代码的调试,其实就是使用jre自带的jdwpagent来实现的。agentlib参数用于跟在要加载的agent的名字后面,比如这里的jdwp。(更多信息请参考官网)可以通过ps-ef|查看运行的jargrepjava命令。4.4.在IDEA中配置RemotDebug1,点击EditConfigurations---->点击Add---->选择Remote即可看到默认配置,如下图。我们进行自定义配置,填写服务器IP和端口号进行调试。运行IDEA进行远程调试。验证远程DEBUG调试是否可行。(尝试下断点,请求服务端接口)如下图,可以看到已经跳进了断点。OK,这时候我们就可以开始DEBUG了,是不是方便找问题!5、远程DEBUG调试有什么优缺点?优点:在本地设置断点,直接访问在线程序,方便调试。(在线程序出现问题,无法根据日志查看时)。缺点:可能造成“阻塞”。(在同一个程序中,其他接口请求可能在本地断点完成之前被“阻塞”)。总结:使用这种方式有利有弊,是否使用根据不同的场景来判断。