底层技术揭密:java调试工具实现原理与使用技巧

java 技术栈的程序员大多使用过远程调试。如果你还没有用过java远程调试,请仔细看一看本篇文章第一小节,查问题效率立即提升数倍;对于使用过java远程调试的老手来说,有没有想过它的底层是怎么实现的呢?今天这篇文章就来揭秘(程序员应该了解自己每天使用的工具,磨炼自己的技艺)

1. Java远程调试基本操作

Java进程默认不支持远程调试,如果需要远程调试,必须在启动java之前加上特定选项。

第一步、在启动JVM的时候,加上以下调试选项:

  1. Java 5以前: -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1044

  2. Java 5及以后: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044

两者之间有啥区别:

“-Xdebug -Xrunjdwp” 主要用于Java 5以前。其中,“-Xdebug”是让JVM开启调试支持,开启调试功能就会要求jvm运行于解释执行模式,因此,java程序的执行速度就变得非常非常慢;“-Xrunjdwp”是让JVM运行一个JDWP协议,从而允许远程调试。

-agentlib:jdwp 用于Java 5及以后,开启后JVM运行于JIT模式,速度更快。因为Java 5采用了HotSpot VM,增加了动态反优化技术,使得调试速度更快。通过这个选项长期开启调试支持也不会影响程序运行速度。同时还支持热交换技术,使得在调试的过程中可以修改Class的代码,从而更快速地定位到问题。

以上两种方式,都需要进一步配置远程调试参数,即“runjdwp:”和“jdwp=”后面的选项。选项具体配置如下。

第二步、在IntelliJ IDEA中,新建一个远程调试的运行配置(Run configuration):

第三步、点击调试按钮,就可以进行远程调试了。

注意要满足以下条件:

  1. 要确保本地代码与远程代码一致;

  2. 被调试的程序在编译的时候,加上了调试信息的(命令:javac -g ...)

2. IntelliJ IDEA 或 Eclipse 如何实现调试功能的

有了远程调试经验的老手们可能会遇到一些实际问题。例如,有的bug在线上能够稳定复现,但是当我们对目标程序进行调试的时候,这个bug竟然神奇般地消失了。你有遇到过这样的问题吗?我就遇到过这样的问题。正是我遇到的这个诡异现象促使我全面了解了一遍java远程调试到底是怎么实现的,它对目标程序自身有什么影响?

比如,我们在debug一段程序的时候,需要设置断点,然后再单步执行。当程序运行到某个断点位置时,这个线程就会被suspend,等待我们的debugger告诉目标程序,下一步要怎么执行,

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值