在预发环境下进行debug时,时常因为工具和环境的限制,导致debug体验非常差,那么有什么方法能够简化我们进行debug的体验吗?JDB就是一种。

JDB是 The Java Debugger 的简称,它可以用来debug一个Java程序,同时它是 JPDA 的一个参考实现,只是这个实现是基于命令行的。提到命令行,有些同学心里就犯嘀咕了,离开了GUI,能debug吗?当然可以,只要熟记几个命令,在受限环境下debug不是不可能。

使用JDB的目的是,更细节的诊断和操控代码,如果只是观察值,可以使用arthas之类的工具

JPDA

JPDA将调试过程分为两部分:被调试的程序(被调试者-debuggee)和JDI(调试者-debugger)。JDI一般为一个调试应用程序的用户接口(或Java IDE的一部分),本文中就是JDB。被调试的应用程序在后端运行,而JDI在前端运行。在前端与后端之间有一个通信通道运行JDWP(Java Debug Wire Protocol)协议,因此,被调试程序与调试器可以位于同一个系统内,也可位于不同的系统中。

jpda.png

从开发者的角度,一个调试应用程序可进入任何JPDA层面。只要JDI基于JDWP,就可以debug任何厂商实现的JVM了,比如:j9等。

JDWP 有两种基本的包(packet)类型:命令包(command packet)和回复包(reply packet)。

在JDB里的例子中,我们使用JDB通过socket向本地的JVM发送JDWP请求。

Debugger 和 target Java 虚拟机都有可能发送 command packet。Debugger 通过发送 command packet 获取 target Java 虚拟机的信息以及控制程序的执行。Target Java 虚拟机通过发送 command packet 通知 debugger 某些事件的发生,如到达断点或是产生异常。

Reply packet 是用来回复 command packet 该命令是否执行成功,如果成功 reply packet 还有可能包含 command packet 请求的数据,比如当前的线程信息或者变量的值。从 target Java 虚拟机发送的事件消息是不需要回复的。

环境

一般来说需要准备一个应用、代码包括数据库等,这样真实的案例才容易有感觉。这里笔者准备了一个简单的项目:https://github.com/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是服务的实现,代码和准备debug的点:

code-service.png

服务实现就是查询DAO后,将结果返回,如果找得到则返回值,否则返回null,我们会在26行进行debug。

示例

首先启动应用,如果要进行debug,一般都会在应用上配置对应的调试参数,包括调试的端口。

java -agentlib: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

本例中是将调试端口开在5005。

接下来运行jdb,连接到调试端口上进行调试。

点击观看,操作流程。

命令

说明

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=5005

使用jdb连接本地的调试端口,线上可以在/opt/taobao/java对应的JavaHome下找到jdb命令

stop at com.murdock.books.spring.guide.springboot.service.impl.AuthorQueryServiceImpl:26

断点打在com.murdock.books.spring.guide.springboot.service.impl.AuthorQueryServiceImpl的第26行

clear

列出所有断点

clear com.murdock.books.spring.guide.springboot.service.impl.AuthorQueryServiceImpl:26

清除对应的断点

locals

列出当前的变量,包括本地变量,参数变量等

print x

打印输出变量x

dump x

dump对应的变量x

wherei

当前debug所在的线程堆栈,输出当前的堆栈

next

下一步,代码向下执行

cont

代码执行放过,继续执行,会停留在下一个断点处

mysql jdb_使用JDB进行调试相关推荐

  1. visual MySQL 教程_MySql轻松入门系列——第二站 使用visual studio 对mysql进行源码级调试...

    一:背景 1. 讲故事 上一篇说了mysql的架构图,很多同学反馈说不过瘾,毕竟还是听我讲故事,那这篇就来说一说怎么利用visual studio 对 mysql进行源码级调试,毕竟源码面前,不谈隐私 ...

  2. MySQL源码学习——DBUG调试

    一.前言 在规模稍微大点的项目中,为了方便快速找到bug的所在,我们往往需要在代码中加入一些调试用的代码,比如加入一些printf,打印出一些重点的信息:加入assert,进行断言判断.这些比较随意的 ...

  3. Mysql源码编译和调试debug

    下载源码 直接从github 上下载了源码.git 地址:https://github.com/mysql/mysql-server 下载路径如:/work/mysql-server 编译 依赖 ma ...

  4. mysql 存储过程 控制台_mysql 存储过程 调试

    mysql存储过程之游标遍历数据表 原文:mysql存储过程之游标遍历数据表 今天写一个mysql存储过程,根据自己的需求要遍历一个数据表,因为对存储过程用的不多,语法不甚熟悉,加之存储过程没有调试环 ...

  5. Win7+VS2010:mysql 源码编译与调试

    win7+vs2010源码编译mysql 最近由于在实习,工作重点在于一些数据库的开发,为了更好的理解数据库的实现机制,目前萌生了要研究一下mysql数据库源码的想法.那么好吧,说干就干,首先我们需要 ...

  6. jdb 调试 java_Java逆向基础之JDB动态调试

    JDB在有源代码的时候可以实现调试远程机器上的java程序,但是在逆向中源码很难分析出来,不过还是能够调试得到一部分信息的 本文主要获取两个信息 1.动态调用混淆类中的方法,因为实践过程中我们去手动补 ...

  7. linux命令行 jdb,linux下jdb远程调试tomcat源码

    在tomcat打开调试设置jvm参数 -Xrunjdwp:transport=dt_socket,server=y,address=9090,suspend=y 在linux命令行jdb连接9090端 ...

  8. linux命令行 jdb,设置调试linux下jdb远程调试tomcat源码

    时间紧张,先记一笔,后续优化与完善. 在tomcat打开调试设置jvm参数 -Xrunjdwp:transport=dt_socket,server=y,address=9090,suspend=y ...

  9. JDB附加调试线上JAVA程序

    前面介绍过用Eclipse远程调试JAVA程序,见Eclipse远程调试JAVA程序,但现场环境中通常没有安装Eclipse,这时候就可以用jdb来附加进程调试了. 1)首先要保证使用以下命令启动JA ...

最新文章

  1. java冒泡排序_Java中的经典算法之冒泡排序(Bubble Sort)
  2. 你所不知道的 Android Studio 调试技巧
  3. SQL语句的解释计划
  4. 怎么查看oracle数据库表的主键,Oracle中查看所有的表,用户表,列名,主键,外键...
  5. 遗传算法求二元函数极值怎么编码_遗传算法求解一元函数二元函数最值
  6. Android studio导入第三方库的各种方法和eclipse的导入方式对比
  7. WSFC2008R2跨群集迁移WSFC2012R2
  8. 用js来实现那些数据结构12(散列表)
  9. 利用python读取栅格数据
  10. Java HashMap与Hashtable数据结构和特点+HashSet简述
  11. UVA10494 If We Were a Child Again【大数除法】
  12. 计算机主板上常用的接口,电脑主板上接口怎么接 主板所有接口插线功能作用识别图解...
  13. 软件测试的目的和原则
  14. 修改thinkpad 小红点(TrackPoint速度)
  15. 魅蓝手机ROOT权限获取
  16. 区别: @Secured(), @PreAuthorize() 及 @RolesAllowed()
  17. vscode 是干什么用的_vscode这个软件有什么用
  18. 计算机学院举办 温暖冬日 感恩社会 活动,温暖冬日 感恩社会 计算机学院举办冬季送温暖活动...
  19. Python笔记:数据切片
  20. web渗透--vnc密码破解

热门文章

  1. Java Comparator.comparing比较导致空指针异常
  2. 用Python chardet库来判断文件编码
  3. BackPressure详细介绍
  4. Linux下无法使用 itoa 函数的解决方法
  5. 一条简单的sql语句运行15天的原因分析(r5笔记第17天)
  6. 扔玻璃球 [ Google面试题 ]
  7. 国外服务器buyvm无法安装宝塔完美解决方法
  8. ROG 幻 16 2022 款怎么样
  9. 深度孪生自注意力网络:小样本条件下的多维时间序列分类
  10. ActiveMQ问题与调优