程序员的日常工作除了写代码之外,很大一部分时间将会在查找 BUG,解决问题。查找 BUG,离不开在 IDE 中调试代码。熟练的掌握调试技巧,可以帮助我们减少查找时间,快速定位问题。

在 IDEA 中调试代码很方便,只要开启调试,在相应代码处使用断点,然后进行相应调试即可。正是因为只要掌握这几个功能,就可以调试代码,所以在很长一段时间内,不了解其他调试技巧。后续深入使用 IDEA 过程中,不断学会 IDEA 其他调试技巧,很大程度上加快调试速度。

Step 系列按钮

日常调试的过程中为了为了找到程序的bug,通常需要单步调试,一步一步跟踪程序执行的流程,根据变量的值,找到最终原因。

IDEA 中提供一系列 Step 功能按钮用于单步调试,可以在 Run 菜单栏找到全部 Step 功能。

另外在调试窗口也可以找到,不过这里只会显示一部分常用按钮。

调试过程中,使用频率最高的可能就是 Setp OverSetp Over 可以单步调试代码,但是当碰到方法执行时,不会进入方法内,直接调用了方法,然后到下一行。

如果需要进入方法内,需要使用 Step IntoStep Into 可以进入调用的方法内,不过默认情情况下并不会进入 java.* 等类的方法中。如果需要进入,可以在 Setting-Stepping 中设置,排除即可。。

另外还可以使用 Force Step Into,强制进入。

当碰到一行代码调用多个方法时,使用 Step Into 就比较蛋疼了。Step Into 会按照调用顺序进入调用的方法,但是往往我们只想进入其中一个方法而已。

这种场景下我们可以使用 Smart Step Into ,选择指定方法进入。

有些情况下,在进入一个方法后,可以使用 Setp Out,快速执行方法,然后跳回到调用处。

另外在进入 for/while 循环里面的后,如果不在循环代码外面打断点出来,就需一步步随着循坏代码执行结束,特别麻烦。在这里就可以使用 Setp Out Of Code Block,快速跳出循环代码块。

断点使用技巧

临时断点

一般调试的时候,我们会在代码行使用断点,然后运行测试,等到程序遇到断点暂停时,查看相关变量内容。

在 IDEA 中,默认断点将会一直存在。有时候仅仅想需要暂停第一次,临时查看,这个时候我们可以使用临时断点。使用快捷键 Ctel + Alt + Shift +F8 可以快速创建临时断点或者按住 ALt,然后再创建断点。。

条件断点

有时候我们在循环处理数据的过程中,可能只关心某个条件的数据,这种情况下我们使用条件断点。

右击断点,弹出设置断点属性的窗口,我们就可以在 condition 处设置条件。IDEA 会在满足这个条件时候,才会暂停程序。

另外设置的条件断点样式也会比较特殊,

多线程断点

在调试多线程的项目时候,如果在多个线程代码处打上了断点,调试的时候你会发现,只能串行的调试。

上面多线程程序,两个线程启动之后,程序也许会在 thread1暂停,也许会在 thread2处暂停。只要任一个断线暂停之后,另一处断点线程就会被阻塞。这时只能调试完暂停处线程的断点,才能跳到第二处断点,调试起来非常不方便。

我们可以设置断点线程属性,改变这个特性。

我们可以在断点上使用鼠标右键弹出断点设置框,在 Suspend 选择 Thread 选项。重新启动上面的程序,然后在调试窗口 Frames 可以看到 thread1thread2两个线程。其中两个线程均可进入调试,此时程序调试位于 thread1 处。这时选择框选择thread2,就可以调试 thread2.

另外,断点的多线程属性可以设置默认属性,点击 Make Default 按钮,设置默认 Suspend属性。

回退调试程序

调试的时候,有时候会进错方法或者错过一个方法调用过程,这个时候往往只能重新开始从头开始执行调试一遍。从新开始调试,可能还需要设置相关参数,修改数据库状态等,非常麻烦。所以如果在调试过程中可以回退就可以不用重新开始。

IDEA 中可以使用 Drop FrameForce Return 回退调试程序。

Drop Frame

Drop Frame 字面意思为丢栈。JVM 中使用栈帧用于进行方法调用数据结构,每次方法调用,对应着一个栈帧在虚拟机中从入栈到出栈的过程。调用方法之后,该方法栈帧将会位于栈顶。

执行 Drop Frame,丢弃栈顶栈帧,于是程序将会回到调用方法处。

调试上面的程序,在上面断点处,使用 Drop Frame,就可以跳回方法调用处,即第三行。查看输出窗口,发现并没有任何输出。

Drop Frame 可以在调试窗口栏找到。

注意与 Step Out 区别,执行 Step Out,方法将会执行结束之后再返回到调用处。

Force Return

Force Return 强制返回,可以在程序执行到一半时强制返回结束程序。可以在 Frames 找到。

点击 Force Return,可以设置返回值。

深入学习 Intellij IDEA 调试技巧的更多相关文章

  1. IntelliJ IDEA 调试技巧

    程序员的工作内容,有不少的时间是用在调试代码上.可以说不是在调试代码,就是即将调试代码. 掌握调试代码的一些技巧,在使用IDE提供的debugger时会快速定位问题的方式. 1.多线程调试 在多线程应 ...

  2. java与.net比较学习系列(1) 开发环境和常用调试技巧

    最近因为公司项目要由.net平台转到java平台的原因,之前一直用.net的我不得不开始学习java了,刚开始听到说要转java的时候很抗拒,因为我想专注在.net平台上,不过这样也并不完全是坏事,通 ...

  3. 《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  4. (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇

    背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇

  5. java系列:《java核心技术 卷1》学习笔记,chapter 11 调试技巧

    11. 6 调试技巧 1)一个不太为人所知却非常有效的技巧是在每个类中放一个main方法,这样就可以对每个类进行单元测试.这个方法可以保留,因为在java虚拟机只调用启动类的main方法. 2)   ...

  6. VS调试技巧,提高调试效率(转):

    如果你还没有使用过这些技巧,希望这篇博文能帮你发现它们. 它们学起来很容易,能帮你节省很多时间. 运行到光标(Ctrl+ F10) 我经常看见人们是这样来调试应用程序的: 他们在应用程序需要调试的代码 ...

  7. iOS各种调试技巧豪华套餐

    转载自http://www.cnblogs.com/daiweilai/p/4421340.html 目录 前言 逼优鸡 知己知彼 百战不殆 抽刀断Bug 普通操作 全局断点(Global Break ...

  8. Visual Studio的调试技巧

    Visual Studio的调试技巧 [原文地址] Debugging Tips with Visual Studio 2010 [原文发表日期] 2010/8/19 10:48 AM 这是我写的关于 ...

  9. xcode的调试技巧

    转自:http://www.cnblogs.com/daiweilai/p/4421340.html#biyouji 目录 前言逼优鸡知己知彼 百战不殆抽刀断Bug 普通操作 全局断点(Global ...

随机推荐

  1. Storm 学习之路(六)—— Storm项目三种打包方式对比分析

    一.简介 在将Storm Topology提交到服务器集群运行时,需要先将项目进行打包.本文主要对比分析各种打包方式,并将打包过程中需要注意的事项进行说明.主要打包方式有以下三种: 第一种:不加任何插 ...

  2. Java学习笔记——设计模式之十.观察者模式

     观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. Subject类: ...

  3. VIM技巧, .vimrc文件

    将 .vimrc文件上传到用户家目录下 文件内容如下: autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()&quo ...

  4. 图解kafka - 设计原理解析

    什么是消息队列? 简单来说,消息队列是存放消息的容器.客户端可以将消息发送到消息服务器,也可以从消息服务器获取消息. 问题导读: ********* 为什么需要消息系统? kafka架构? kafka ...

  5. POJ 3692:Kindergarten(二分图最大团)

    题目链接 题意 已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识.现在要选择一些学生来组成一个集合,使得里面所有人都认识,求此集合最 ...

  6. 无法启动iis express web服务器解决

    VS2013 .VS2015 .VS2017调试出现无法启动iis express web服务器 最近自己老是遇到这个问题,天天如此,烦死人,网上答案繁多,但是都解决不了,也是由于各种环境不同导致的, ...

  7. ZigBee入门第一天

    按键查询控制灯的状态 1.宏定义灯和按键 2.按键和灯初始化 3.用if语句消抖的方法,实现按键控制灯的状态 相关寄存器 PxSEL PxDIR #include"ioCC2530.h&qu ...

  8. 什么是JDK什么是JRE?JDK和JRE的关系

    什么是JDK什么是JRE?JDK和JRE的关系 我们看看来自百度百科的解释: JDK是 Java 语言的软件开发工具包,主要用于移动设备.嵌入式设备上的java应用程序.JDK是整个java开发的核心 ...

  9. Class(类)和 继承

    ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而已. //定义类 class Point { co ...

  10. 20190716 NOIP模拟测试4 考试反思

    总分 127分 满分300 第一题 礼物 10分 一道期望题,看起来挺简单,但对于概率与期望这一块我还不怎么会,花了一个小时调他,最后只QJ了一下10%的测试点 第二题 通讯 90分 显然的缩点求解, ...