前言

上一篇文章 IntelliJ IDEA 高级调试之Stream Trace 算是 IntelliJ IDEA 高级调试技巧的开胃菜,很多小伙伴被这个小技巧征服。趁热打铁,今天给大家带来几个我日常工作以及阅读源码必备的 IntelliJ IDEA 高级调试技巧,分分钟要起飞的节奏

断点处添加 log

很多程序员在调试代码时都喜欢 print 一些内容,这样看起来更直观,print 完之后又很容易忘记删除掉这些没用的内容,最终将代码提交到 remote,code review 时又不得不删减这些内容重新提交,不但增加不必要的工作量,还让 log tree 的一些节点没有任何价值

IntelliJ IDEA 提供 Evaluate and Log at Breakpoints 功能恰巧可以帮助我们解决这个问题, 来看下面代码:

public static void main(String[] args) {ThreadLocalRandom random = ThreadLocalRandom.current();int count = 0;for (int i = 0; i < 5; i++) {if (isInterested(random.nextInt(10))) {count++;}}System.out.printf("Found %d interested values%n", count);}private static boolean isInterested(int i) {return i % 2 == 0;}

假如我们想在第 15 行查看每次调用,随即出来的 i 的值到底是多少,我们没必要在这个地方添加任何 log,在正常加断点的地方使用快捷键 Shift + 鼠标左键,就会弹出下面的内容

勾选上 Evaluate and log, 并自定义你想查看的 log/变量,比如这里的 "interested" + i, 这样以 Debug 模式运行程序(正常模式运行,不会打印这些 log):

interested 7
interested 5
interested 1
interested 2
interested 0
Found 2 interested values

如果你在多处添加了这种断点,简单的看 log 可能偶尔还是不够直观,可以勾选上面图片绿色框线的 "Breakpoint hit" message :

Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 6
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 0
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 9
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 8
Breakpoint reached at top.dayarch.TestDebug.isInterested(TestDebug.java:49)
interested 1
Found 3 interested values
Disconnected from the target VM, address: '127.0.0.1:0', transport: 'socket'Process finished with exit code

如果你想要更详细的信息,那就勾选上 Stack trace (大家自己查看运行结果吧),有了这个功能,上面说的一些问题都不复存在了

字段断点

如果你阅读源码,你一定会有个困扰,类中的某个字段的值到底是在哪里改变的,你要一点点追踪调用栈,逐步排查,稍不留神,就可能有遗漏

我们可以在 IntelliJ IDEA 中为某个字段添加断点,当字段值有修改时,自动跳到相应方法位置

使用起来很简单:

  1. 在字段定义处鼠标左键添加断点(会出现「眼睛」的图标)

  2. 在「眼睛」图标上鼠标右键

  3. 在弹框中勾选上 Field accessField modification 两个选项

如果修改字段值的方法比较多,也可以在 Condition 的地方定义断点进入条件, 有了这个功能的加成,相信你阅读源码会顺畅许多

异常断点

除了阅读源码,一定是遇到了异常我们才开始调试代码,代码在抛出异常之后会自动停止,但是我们希望:

代码停在抛出异常之前,方便我们查看当时的变量信息

这时我们就用到了 Exception Breakpoints, 当抛出异常时,在 catch 的地方打上断点,可以通过下图的几个位置获取栈顶异常类型,比如这里的 NumberFormatException

知道异常类型后,就可以按照如下步骤添加异常断点了:

然后在弹框中选择 NumberFormatException

重新以 Debug 模式运行程序:

程序「一路绿灯式」定位到抛出异常的位置,同时指出当时的变量信息,三个字:稳,准,狠,还有谁?

方法断点

当阅读源码时,比如 Spring,一个接口的方法可能被多个子类实现,当运行时,需要查看调用栈逐步定位实现类,IDEA 同样支持在接口方法上添加断点(快捷键 cmd+F8/ctrl+F8):

  1. 鼠标左键在方法处点击断点(♦️形状)

  2. 断点上鼠标右键

勾选上绿色框线上的内容,同样可以自定义跳转条件 Condition

当以 Debug 模式运行程序的时候,会自动进入实现类的方法(注意断点形状):

看到这你应该想到常见的 Runnable 接口中的 run 方法了,同样是有作用的,大家可以自行去尝试了

总结

相信有以上四种调试技巧的加成,无论是工作debug 还是私下阅读源码,都可以轻松驾驭了。最后,来看看 IDEA 支持的各种断点调试类型,如果你只知道红色小圆点,那咱在留言区好好说说吧

热门内容:不要再自己封装各种Util工具类了,这款神仙级框架你值得拥有!神级开源框架发布!Github排名前三,连Spring Cloud 都被干掉了!为什么不推荐使用BeanUtils属性转换工具
译 | 缓存穿透问题导致Facebook史上最严重事故之一最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

起飞,会了这4个 Intellij IDEA 调试魔法,阅读源码都简单了相关推荐

  1. IntelliJ IDEA断点调试如何查看源码

    IntelliJ IDEA断点调试如何查看源码 推荐方法二 方法一: 使用 force step into :快捷键 alt + shift + F7(就是IDEA调试控制台页面上的那个红色的箭头) ...

  2. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  3. 通过IntelliJ IDEA单步调试JDK源码

    通过IntelliJ IDEA单步调试JDK 0 使用环境: 宿主机操作系统:Windows 10 专业版 虚拟机软件:VMware® Workstation 16 Pro 虚拟机操作系统:ubunt ...

  4. zookeeper -- Mac 上 Intellij IDEA 配置 zookeeper(3.5.8) 源码阅读、运行、调试环境

    近期需要整理MIT6.824 中 分布式系统协调服务 zookeeper 的一些知识,想要在Mac 本地搭建一个可以方便运行调试的zookeeper环境,这玩意竟然耗费了一上午的时间,实在是不可忍:当 ...

  5. Mac下编译Android源码,并导入IntelliJ IDEA进行源码阅读

    macOS High Sierra 版本 10.13.4 Xcode 9.3 aosp分支:android-8.1.0_r20 准备编译环境 具体参考官方文档 安装 jdk8u45 or newer ...

  6. IntelliJ IDEA scala的源码设置

    intellij idea设置指向源代码--Scala的源码设置 下载源码包 首先在官网进行下载源码包https://www.scala-lang.org/download/ 解压压缩包 利用压缩工具 ...

  7. intellij远程调试_IntelliJ中的远程调试Wildfly应用程序

    intellij远程调试 远程调试Java应用程序意味着使用本地开发环境连接到远程运行的应用程序. Java开箱即-agentlib:jdwp[=options]支持远程调试:目标应用程序必须使用-a ...

  8. jmeter学习指南之源码导入 IntelliJ IDEA

    使用环境: Win 7 + JMeter 5.0 + IntelliJ IDEA 2018.2.6 (为方便书写,本文中写的均是简称 IDEA) 1.下载并解压 jmeter 源码 ×××地址: ht ...

  9. java 注释工具栏_eclipse/intellij idea 查看java源码和注释方法

    工作三年了,一直不知道怎么用IDE查看第三方jar包的源码和注释,惭愧啊!看源码还好些,itellij idea自带反编译器,eclipse装个插件即可,看注释就麻烦了,总不能去找api文档吧!现在终 ...

最新文章

  1. Beta 冲刺(5/7)
  2. Alpha 冲刺 (7/10)
  3. java 获取td_[Java教程]jQuery获取table表中的td标签
  4. (王道408考研数据结构)第六章图-第四节5:最短路径之弗洛伊德算法(思想、代码、演示、答题规范)
  5. 设计模式——单例模式详解
  6. AIO系列文档(1)----图解ByteBuffer
  7. Windows去除快捷箭头
  8. 嵌入式操作系统内核原理和开发(改进型优先级调度)
  9. JDBC操作数据库的基本步骤:
  10. 如何新建一个datatable,并往表里赋值
  11. 应届生从头脑风暴到游戏策划案的个人思路(二)
  12. font-style字体设置
  13. 手机号注册获取随机验证码
  14. SQL2005到2008数据库升级
  15. Python实现两个有序集合的交集和并集
  16. latex打出 像小写l一样的字母
  17. 一文掌握语义分割PSPNet——证件照制作、抠图(算法原理、Pytorch实现)
  18. 视频封面如何统一修改怎么设置为同一张图片
  19. 发布、发版、上线流程
  20. 华为GaussDB数据库10个知识点,第7个你知道么?

热门文章

  1. 利用计算机软件温度补偿,基于自主传感器信号调理芯片温度补偿的软件设计
  2. mysql5.7 sql监控_MySQL5.7中 performance和sys schema中的监控参数解释
  3. 2018-3-18Zookeep
  4. 非结构化信息-》半结构化-》结构化-》关联数据体系-》数据挖掘-》故事化呈现-》决策导向
  5. QT报错“qt.network.ssl: QSslSocket: cannot resolve SSLv2_client_method”
  6. asp vb 插入,更新,删除数据库操作。
  7. 青少年电子信息智能创新大赛 -- Python编程挑战赛初赛试题说明
  8. 尚育鹏:Leetcode刷题总结(数组)
  9. 【组队学习】【24期】数据挖掘实践(智慧海洋)
  10. 刻意练习:LeetCode实战 -- Task28.跳跃游戏