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

问题

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

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

正文

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

Java Agent

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

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,就算英文不好,也能先从中文开源项目入手,更何况国人的优秀开源项目越来越多,绝对受益匪浅

猜你喜欢

转载自juejin.im/post/5d3c0bdc51882505974ff065