远程debug调试入门
这篇文章主要介绍了Eclipse的Debug调试技巧大全(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧吗,希望能给你带来帮助
1.远程DEBUG的必要性
由于部署环境的差异性,相信很多朋友都碰到过开发环境正常测试过的功能在测试环境甚至生产环境下出现bug的情况。一般情况下,生产环境可以采取的手段比较单一,即通过日志的方式获取运行中的环境上下文,分析日志文件并尝试重现bug。这会带来的问题还是不少的,首先,日志的分析是一项比较耗时的工作;其次,现有的日志记录不一定能反映出问题,你可能需要多次重复这个过程(分析日志->猜测问题->加日志->部署->获取日志)来慢慢逼近问题。倘若是测试环境,我们还多了一项可供选择的手段――远程调试――将程序在测试环境中以debug模式启动,在本机使用IDEA在工程中设置断点进行调试。
2,IDEA构建SpringBoot测试Demo
新建SpringBoot测试项目remote-debug,只需要web依赖支持即可;版本选用2.2.6.RELEASE(注意,别用2.5.1版本,有坑,亲测)
pom.xml:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.6.RELEASE com.java1234 remote-debug v1.0 remote-debug Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
application.yml:
server: port: 80 servlet: context-path: / tomcat: uri-encoding: utf-8
简单搞个TestController,提供一个Rest接口
package com.java1234.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; /** * @author java1234_小锋 * @site www.java1234.com * @company Java知识分享网 * @create 2021-06-12 15:37 */ @RestController public class TestController { @PostMapping("/test") public String test(Integer id,String name){ System.out.println("id="+id); System.out.println("name="+name); if(id>0){ return "success "+name; }else{ return "fail"; } } } 我们启动项目,用postman测试下:
测试接口:http://localhost/test 加入Body form-data 参数 id=1,name=marry,Send 测试,返回 success marry,测试OK;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPf6tyol-1623688298210)(image-20210613222730931.png-600)]](https://ss.0133.cn/article/ed/08/a6/ed08a626905b5e2254b6e8ae38fe2e9c.jpg-600)
3,测试Demo项目配置支持远程调试
pom.xml里配置jvmArguments参数 -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n:
org.springframework.boot spring-boot-maven-plugin -Xdebug -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
加了此配置后,打包后的项目发布服务器,可支持远程DEBUG;
具体参数详解:
-Xdebug 通知JVM工作在DEBUG模式下;
-Xrunjdwp 通知JVM使用(Java debug wire protocol)运行调试环境。该参数同时包含了一系列的调试选项;
**transport **指定了调试数据的传送方式,dt_socket是指用SOCKET模式,另有dt_shmem指用共享内存方式,其中,dt_shmem只适用于Windows平台;
address 调试服务器的端口号,客户端用来连接服务器的端口号;
server=y/n VM 是否需要作为调试服务器执行;
suspend=y/n 是否在调试客户端建立连接之后启动 VM;
4,IDEA打包jar
我们打包jar包;
右侧Maven工具,双击 package打包工具;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3t35X1S1-1623688298215)(image-20210613224738500.png-600)]](https://ss.0133.cn/article/9a/ee/f1/9aeef1a908bfdcfcd79e9e488489a6d8.jpg-600)
一般打包跳过test,可以点击箭头所指闪电图标,这样打包速度会快很多;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjGv5k7R-1623688298218)(image-20210613224828589.png-600)]](https://ss.0133.cn/article/7f/f0/0a/7ff00ae8927a6ea243960d2b5319bc29.jpg-600)
打包后,在target目录下,会生成一个jar包;我们把它复制出来即可;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K5FN6ULx-1623688298222)(image-20210613224918420.png-600)]](https://ss.0133.cn/article/4e/61/54/4e615407f8e1708c4a9f6e998651d1b3.jpg-600)
5,启动jar并且带启动参数支持远程调试
我们把remote-debug-v1.0.jar放D盘根目录;
我们启动jar,并且支持远程DEBUG;
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar remote-debug-v1.0.jar
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RERGHClm-1623688298225)(image-20210613225414441.png-600)]](https://ss.0133.cn/article/d6/af/62/d6af6293c49818e7875c6ef55dfedd8a.jpg-600)
启动OK,监听socket 5005端口
6,IDEA远程DEBUG配置
IDEA要进行远程DEBUG,需要进行配置;
1,启动项下拉,选择 Edit Configurations...编辑配置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3UGDXNMD-1623688298228)(image-20210613225801811.png-600)]](https://ss.0133.cn/article/73/11/77/731177a4ffec6b51b5825c1de5406278.jpg-600)
2,点击+,选择Remote,添加远程DEBUG配置
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rzwtdYm-1623688298229)(image-20210613230023399.png-600)]](https://ss.0133.cn/article/83/bf/89/83bf89bc6a2cf4b9f819c75de1e87bd5.jpg-600)
3,添加远程DEBUG配置项,Host和Port,配置后,点击Apply和OK按钮
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0edF9KU-1623688298231)(image-20210613230200362.png-600)]](https://ss.0133.cn/article/7f/a2/bb/7fa2bbf64e5bb557510bcfaa7f28cffd.jpg-600)
7,IDEA远程DEBUG测试
1,打测试断点
我们直接在TestController类里的test方法上打点断;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2MqDENbp-1623688298232)(image-20210613230809384.png-600)]](https://ss.0133.cn/article/55/07/2a/55072a726a614aaea53033b2c0019480.jpg-600)
2,选择远程debug启动项,然后点击测试调试按钮启动;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HWmN2f6b-1623688298234)(image-20210613230646749.png-600)]](https://ss.0133.cn/article/48/52/f7/4852f7523a2d421e31ee64beaeace320.jpg-600)
3,postman测试
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VJrvld2D-1623688298236)(image-20210613231151240.png-600)]](https://ss.0133.cn/article/a2/3c/93/a23c934a765ad21730da7ab91ee7f6f9.jpg-600)
4,成功进入断点
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeCKrJS3-1623688298238)(image-20210613231235544.png-600)]](https://ss.0133.cn/article/0e/57/1e/0e571ecf4a0a77a2629a577ccf762b61.jpg-600)
我们走完断点;
5,启动的jar包打印信息,测试OK
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-waIbt2vf-1623688298241)(image-20210613231336792.png-600)]](https://ss.0133.cn/article/07/9c/0e/079c0e7ae1ed85e04061f0c6483b6f1f.jpg-600)
8,eclipse远程DEBUG实现
1,右击项目 -> Debug As -> Debug Configurations…
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCIa03JQ-1623688298243)(image-20210613232154571.png-600)]](https://ss.0133.cn/article/47/f4/72/47f47299e2f47fb3dad023ea1289adcd.jpg-600)
2,找到 Remote Java Application 然后右击 New
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o1TZdUQg-1623688298245)(image-20210613232409021.png-600)]](https://ss.0133.cn/article/48/c9/db/48c9dbf9c71bc1f9a32b04d59b9f7715.jpg-600)
3,配置Host和Port,点击Debug按钮,即可实现远程DEBUG
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pDNULzPO-1623688298248)(image-20210613232629335.png-600)]](https://ss.0133.cn/article/71/e5/f6/71e5f6b9f0dafd1a1ba562c9f8418d86.jpg-600)
9,打war包方式配置远程DEBUG
如果打的是war包,需要两个步骤:
1.将 web 应用部署到 Tomcat 的 webapp 目录下
2.修改 Tomcat/bin/startup.bat 文件,在最前面加上如下代码:
SET CATALINA_OPTS=-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005