Intellij IDEA调试功能

背景

Java项目开发过程中,有些问题通过调试来实时分析可以达到事半功倍的作用。

原理

本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信,传递调试指令和调试信息。通常调试的程序被称为debugger, 而被调试的程序称为 debuggee。
在 Debug 领域,JDK 有一套规范与体系来支持,即 Java Platform Debugger Architecture,JPDA 体系。在 JPDA 体系中定义了 三个角色,每个角色又对应着不同的技术模块支撑,分别为 JVMTI/JDWP/JDI。

  • JDI(Java Debugger Interface):Java调试器接口——定义了一个高层次Java接口,开发人员可以利用JDI轻松编写远程调试工具。
  • JVMTI(Java Virtual Machine Tools Interface):Java虚拟机工具接口 ——定义了一个原生(native)接口,可以对运行在Java虚拟机的应用程序检查状态、控制运行。
  • JVMDI:Java虚拟机调试接口()——JVMDI在J2SE 5.0中被JVMTI取代,并在Java SE 6中被移除。
  • JDWP:Java调试线协议()——定义了调试对象(一个 Java 应用程序)和调试器进程之间的通信协议。

面板

debug启动

debug模式启动JVM

  • Jdk1.7之前:
    1
    -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n 
  • jdk1.7之后:
    1
    -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50538,suspend=y,server=n 

连接debug JVM

1
jdb -attach 127.0.0.1:50538

Connected to the target VM, address: ‘127.0.0.1:50538’, transport: ‘socket’

断点

设置断点位置,debug模式下,运行时也可以临时添加断点。

dubeg窗口

以debug模式启动时,会自动激活该窗口

调试按钮

  • Show Execution Point (option + F10):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。
  • Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。
  • Step Into (F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法,如第25行的put方法。
  • Force Step Into (Alt + Shift + F7):强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。
  • Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。
  • Drop Frame (默认无):回退断点,后面章节详细说明。
  • Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。
  • Evaluate Expression (Alt + F8):计算表达式,后面章节详细说明。

服务按钮

  • Rerun ‘xxxx’(command + R):重新运行程序,会关闭服务后重新启动程序。
  • Resume Program (option + command + R):恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了。
  • Pause Program:暂停程序,启用Debug。目前没发现具体用法。
  • Stop ‘xxx’ (command + F2):连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了。
  • View Breakpoints (Ctrl + Shift + F8):查看所有断点,后面章节会涉及到。
  • Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,如图2.4,则该行断点失效。
  • Get thread dump:获取当前活动线程的快照,及JVM中所有Java线程的堆栈跟踪信息。

Frames

方法调用栈窗口。

Variables

这里显示当前方法里的所有变量。

Watches

锁定观察变量值,可以输入需要查看的变量,也可以从Variables里拖到Watche里查看。

参考

Author: suce
Link: https://haoubox.cn/2021/05/11/Intellij-IDEA调试功能/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.