所谓工欲善其事必先利其器,现在idea已经成为java开发者眼中最热门最好用的IDE了。下面这篇文章将总结下idea调试的一些高级技巧。

多线程调试

直接上例子说明,比如下面这段代码

debug模式下调试的时候,发现断点并不会按照我预想的执行,子线程里的断点根本没有执行,两个子线程直接悄无声息的就跑完了。说白了就是我们没有办法进入到线程里断点调试。

有解决方案吗? 当然

我们只需要对断点做一些设置即可:

如上图,把断点的suspend模式改为thread,然后我们再去调试,发现断点可以按照我们预想的执行了。在debug窗口可以通过子线程名选择进入子线程的流程单步调试。

循环遍历条件断点

有时候在遍历一个循环的时候,我们只是想看某个条件下的变量状态。通常情况下都是一遍遍执行直到到达我们想要的条件为止。

其实可以不用这么麻烦,idea提供了条件断点的功能,比如下面这段代码:

我们右键断点位置,设置i=5的条件断点,然后debug执行。会发现程序在i=5的情况下才会进入断点。

显示方法返回值

比如下面这段代码

正常情况下我们调试的时候,是看不到random到底是多少的。解决方法有一个,就是把random的结果赋值到一个变量里,然后在调试窗口观察这个变量的值。

其实idea支持更方便的方法解决上面的问题。调试窗口里的Settings -> Show Method Return Values开关可以显示方法的返回值。

调试过程中动态修改变量的值

比如下面这段代码,

当执行到if分支判断时,可能不会进入我们想调试的分支。通常情况下我们是会在代码里给number写死一个值进行调试。但是这种方式修改了业务代码,如果发布的时候忘记删除,结果不堪设想。

idea有更加优雅的方式解决此类需求。

只需要在debug窗口,通过set value动态修改变量的值,就可以按照我们希望的分支继续执行。是不是很给力!

调试内存泄露

调试内存泄露的关键是能查看堆内存的使用详情,有了详细的信息才好定位出现问题的代码。

我们先写一段示例代码,代码中有各种类型的内存分配。

然后开始debug,在idea的右下窗口打开memory view,

我一般是选择打开这几个选项,

接下来在单步的过程中,就可以看到对象的分配情况。diff栏显示的是每一步对象数目的变化,这个非常有用。因为通过这个你可以看到你的代码对堆内存分配和回收的动作。

参考:

没看这篇干货,别和我说你会IDEA Debug的更多相关文章

  1. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

  2. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  3. 转 Redis 总结精讲 看一篇成高手系统-4

    转 Redis 总结精讲 看一篇成高手系统-4 2018年05月31日 09:00:05 hjm4702192 阅读数:125633   本文围绕以下几点进行阐述 1.为什么使用redis 2.使用r ...

  4. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 本文首发自:博客园 文章地址: https://www.cnblogs.com/yilezhu/p/ ...

  5. 集合类--最详细的面试宝典--看这篇就够用了(java 1.8)

    看了一个星期源码,搜索上百篇博文,终于总结出了集合类的所有基础知识点,学集合,看这篇就够用了!!! 篇幅有点长, 如果你能全部理解,java最重要的集合就不怕了,秒过面试!!!(本篇素材来自网络,如有 ...

  6. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  7. Pycharm新手教程,只需要看这篇就够了

    pycharm是一款高效的python IDE工具,它非常强大,且可以跨平台,是新手首选工具!下面我给第一次使用这款软件的朋友做一个简单的使用教程,希望能给你带来帮助! 目前pycharm一共有两个版 ...

  8. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  9. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

随机推荐

  1. AsyncDisplayKit

    Facebook发布了其iOS UI框架AsyncDisplayKit(ASDK)1.0正式版,这个框架被用于Facebook自家的应用Paper中,能够提高UI的流畅性并缩短响应时间. 下载和使用 ...

  2. R语言parse函数与eval函数的字符串转命令行及执行操作

    parse()函数能将字符串转换为表达式expression:eval()函数能对表达式求解 A <- : B <- 'print(A)' class(B) C <- parse(t ...

  3. SPSS25 下载安装和激活

    目录 1. 其他版本 2. 安装步骤 3. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/p/11648399.html 2. 安装步骤 打开安装包 下 ...

  4. 20140919-FPGA-有效观察设计中的差分信号

    今天回来坐在电脑前,打开Xilinx的Documentation Navigator寻找NCO相关的User Guide,但是在不经意中发现了一个这样的IP,我感觉对于观察设计中的查分信号十分有用.之 ...

  5. 一、SignalR使用心得

    一.通讯模式 以往,我们聊天发消息模式(单体发送消息或通知)-好友(一对一).群组(一对多),方便管理好友-分组方式. 那么聊天和好友管理参考qq,刷新分组标签也页面就会从新加载分组列表和分组内好友列 ...

  6. Tensorflow fintune

    https://zhuanlan.zhihu.com/p/42183653 tf2.0中有更简单的做法,和keras一样

  7. Stack Overflow 推荐编程书单

    Stack Overflow 推荐编程书单   1 Working Effectively with Legacy Code Michael C. Feathers 修改代码是每一位软件开发人员的日常 ...

  8. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    class Solution {     public int[] twoSum(int[] nums, int target) {         for (int i = 0; i < nu ...

  9. hadoop学习一

    一.基本概念https://blog.csdn.net/gwd1154978352/article/details/81095592 二.安装hadoophttps://blog.csdn.net/s ...

  10. 如何保证Redis与数据库的数据一致性

    一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例. 我们该如何保证Redis与数据库的一致性呢? So easy: ...