在预发布环境中调试时,由于工具和环境的限制,调试体验往往很差。有什么办法可以简化我们的调试体验?JDB是一种 JDB是Java调试器的缩写,可用于调试Java程序。它也是JPDA的参考实现,但是这个实现是基于命令行的。 当涉及到命令行时,一些学生感到内疚并离开GUI。能调试一下吗?当然,只要背几个命令,在受限环境下调试也不是不可以。 使用JDB的目的是更详细地诊断和操作代码。如果只是一个观察值,可以使用阿尔萨斯·JPDA·JPDA等工具将调试过程分为两部分:被调试者(debuggee)和JDI (debugger -debugger)。 JDI一般是调试应用程序的客户端接口(或者是Java IDE的一部分),也就是本文中的JDB。 被调试的应用程序在后台运行,而JDI在前台运行。 前台和后台之间有一个运行JDWP(Java Debug Wire Protocol,Java调试线协议)协议的通信通道,所以被调试的程序和调试器可以位于同一个系统,也可以位于不同的系统。 从jpda.png开发者的角度来看,一个调试应用程序可以进入任何JPDA级别。 只要JDI是基于JDWP的,你就可以调试供应商实现的任何JVM,比如j9。 JDWP有两种基本的包类型:命令包和应答包。 在JDB的例子中,我们使用JDB通过套接字向本地JVM发送JDWP请求。 调试器和目标Java虚拟机都可以发送命令包。 调试器通过发送命令包来获取目标Java虚拟机的信息并控制程序的执行。 目标Java虚拟机通过发送命令包来通知调试器某些事件的发生,例如到达断点或生成异常。 回复包用于回复命令包是否可以成功执行。如果成功,应答包还可能包含命令包所请求的数据,如当前线程信息或变量的值。 从目标Java虚拟机发送的事件消息不需要应答。 一般来说,环境需要准备一个应用,代码包括数据库等。,让真实案例也能轻松感受。 在这里,我准备了一个简单的项目:weipeng2k/spring-guide,其中:spring-guide-spring-boot项目,你可以尝试构建一下。 在11.239.175.138,用docker拉起一个mysql实例,具体的jdbc-url是:JDBC:MySQL://11 . 239 . 175 . 138:23306/book,已经在application.properties中配置好了 实际上,应用程序提供了一个rest接口。当你访问:localhost:8080/api/author/1时,会返回作者的信息。 源代码AuthorApi是控制器,代码和准备debug的点:code-api.png可以看到逻辑很简单,就是根据Id查询作者信息,准备debug的位置在第24行。 AuthorQueryServiceImpl是服务的实现,代码和调试准备的点:code-service.png服务实现是查询DAO,然后返回结果。如果找到了,就返回值;否则会返回null,我们用26行调试。 该示例首先启动应用程序。如果要调试,一般会在应用上配置相应的调试参数,包括调试端口。 Java-agent lib:jdwp = transport = dt _ socket,server = y,suspend = n,address = 5005-jar ~/spring-guide-spring-boot/target/spring-guide-spring-boot-1 . 0 . 0-snapshot . jar本例中调试端口打开为500。 接下来,运行jdb并连接到调试端口进行调试。 点击观看,操作过程 Asciicast命令描述JD b-connect COM . sun . jdi . socketattach:hostname = 127 . 0 . 0 . 1,port = 5005使用JDB连接本地调试端口,在线可在/opt/taobao/ Find找到jdb命令STOP AT COM。默多克。书籍。春天。导游。Spring Boot。服务。Iml。Authorqueryserviceimpl: 26断点在com处命中。默多克。书籍。春天。导游。斯普林。gboot . service . impl . authorqueryserviceimpl第26行明确列出所有断点. clear com . murdock . books . spring . guide . spring boot . service . impl . authorqueryserviceimpl:26清除对应的断点L. Ocals列出当前变量,包括局部变量、参数变量等。print x打印出变量xwherei对应的变量xdump xdump,输出当前栈接下来,代码会向下执行。cont代码执行将通过,继续执行,并停留在下一个断点。