debug是什么意思_debug的主要功能


程序出现异常了!

返回结果不正确!

在我这边看并没有出现什么问题。

每逢发生这种异常状况,进行问题处理时,我们的第一反应肯定是

我来先调试一下,迅速找出并解决。

如果是线上出现的问题,我们总会想

如果能直接调试一下就好了。

当我们提及调试时,通常指的是在集成开发环境(IDE)中为代码设置断点,并逐步执行代码进行追踪。在此过程中,我们关注变量的值和输出结果。

大多数的调试工具在IDE如Eclipse、IntelliJ IDEA、NetBeans中均有提供,此外还可以使用JDK自带的jdb工具进行高级调试。这些工具支持本地调试以及远程调试功能。

那么,在我们为代码设置断点、进行调试、单步执行等一系列操作背后,其工作原理是如何实现的呢?

要了解这些,就不得不提及Java平台调试架构(JPDA)。我们所使用的每项调试功能,实际上都是依赖JPDA来实现的。

根据官方文档描述:

Java平台调试架构(JPDA)由三个接口组成,专为桌面系统开发环境中调试器的使用而设计。

我们可以看到,JPDA主要由以下三部分构成:

  • JVMTI(Java Virtual Machine Tool Interface)
  • JDWP(Java Debugger Wire Protocol)
  • JDI(Java Debug Interface)

熟悉JVM的开发人员可能听说过JVMPI和JVMDI,但在JDK 1.5之后,它们被统一替换为JVMTI。

关于JVMTI

我们在之前的文章中提到过Class的hotSwap,它是通过Instrument实现class的redefine和retransform。

本质上来说,JVMTI是一个编程接口,主要用于开发和监控。它提供了接口来观察(inspect)应用状态和控制应用的执行。通过这些接口,工具可以实现以下功能:

  • 性能分析(profiling)
  • 调试(debuging)
  • 监控(monitoring)
  • 线程分析(thread ysis)
  • 覆盖率分析(coverage ysis)

由此可见,我们常用的调试功能,只是JVMTI所提供能力中的一种。

关于JDWP

对于那些观察过Java调试进程的开发者来说,他们可能会注意到以调试方式启动的JVM进程的参数中包含了如"-agentlib:jdwp"的内容。

这里所提到的"-agentlib:jdwp",其实就是我们现在要介绍的JDWP。

什么是JDWP?

Java Debug Wire Protocol(JDWP)是debugger和它要调试的JVM之间进行通信的协议。

需要注意的是,JDWP仅仅是一个协议格式,具体的传输实现并不是由JDWP来完成的。我们的debugger执行的操作发送到JDWP的实现上,然后再由JVMTI来具体控制。

关于JDI

JDI是三个模块中最高层的一个接口。通过JDI,debugger可以更方便地编写符合JDWP格式的数据,用于调试数据传输。JDI的引入提高了开发debugger的效率。

从整体上看,我们可以把JPDA看作两个进行通信的程序之间的桥梁,这使得我们在任何地点都能方便地调试另一个JVM上运行的程序。

每次当我们打开IDE调试一个Java应用,或者远程附加一个Java进程时,不要忘了背后默默支持我们的——JPDA。