你可能并不知道的远程调试技巧

问题

  1. 在咱们的平常开发中,测试人员在测试环境遇到某个问题,经过日志不足以锁定问题,巴不得能够远程调试一下代码
  2. 上一篇文章介绍了SpringBoot的启动,在IDE里直接运行应用的main方法,跳过了SpringBoot的Jarlanucher,不知道该如何调试Jarlanucher的启动过程
  3. 想了解Tomcat的源码,但无法调试Tomcat的启动过程
  4. 我的电脑配置不高,没法运行大量微服务,租用了某云上的虚拟机跑微服务,只能靠手动添加日志来排错,影响开发效率

若是你遇到了上述问题却无从下手,那么你必定要了解一下远程调试,而不是原地踏步用老旧的方法解决变幻莫测的问题windows

正文

在很长的一段时间内,我本身一直觉得调试(Debug)就是IDE的功能,并且只能调试本地的程序,对于远程环境则无能为力。在一次浏览Github优秀的中文开源项目中了解到Java Agent,该项目甚至在Issue里教开发者如何用远程调试,这才知道原来JVM还提供了一套如此优秀的工具,真是相见恨晚啊!!!架构

Java Agent

Java Agent为开发者提供了一种运行时修改字节码的能力,例如JVM级别的AOP,不重启应用直接修改字节码等,利用该技术能够玩出不少应用代码没法实现的花样。socket

JDPA

JDPA全称Java Platform Debugger Architecture(Java平台调试架构),定义了Java平台上的调试体系架构,主要包括3个主要组成部分:JVMTI(Java虚拟机工具接口),JDI(Java调试连线协议)和JDWP(Java调试接口)微服务

JDWP

JDWP全称Java Debug Wire Protocol,定义了调试器和远程JVM之间的调试通信协议工具

JDPA的体系很复杂,咱们做为开发者先学会如何用就能够了。用法也很简单,启动应用的参数加上如下参数就行了测试

-agentlib:jdwp=transport=dt_socket,address=6666,server=y,suspend=n调试

而后IDE里面选择Remote Java Application,填入对应的IP和端口,就能愉快地远程调试了日志

  • agentlib:jdwp 利用了Java Agent技术,选择JDWP做为agent
  • transport=dt_socket 使用socket做为通信方式,实际上windows支持socket和shared memory,而Linux只支持socket
  • address 监听的端口
  • server =y表示该JVM即将被调试
  • suspend =n说明JVM当即运行, 若是设置成y,表示JVM会等待将来将要attached的调试者,适合于调试应用初始化的场景

小结

  • Java Agent提供了十分强大的拓展功能
  • JDPA的远程调试十分好用,为咱们解决问题提供了一条更高效的途径
  • 多逛Github,就算英文很差,也能先从中文开源项目入手,更况且国人的优秀开源项目愈来愈多,绝对受益不浅
相关文章
相关标签/搜索