所谓工欲善其事必先利其器,现在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. ELK-全文检索技术-elasticsearch集群及sde_restful

    1       搭建ES集群 集群的说明 我们计划集群名称为:leyou-elastic,部署3个elasticsearch节点,分别是: node-01:http端口9201,TCP端口9301 n ...

  2. 原生js格式化json和格式化xml的方法

    在工作中一直看各位前辈的博客解决各种问题,对我的帮助很大,非常感谢! 之前一直比较忙没有写博客,终于过年有了点空闲时间,可以把自己积累的东西分享下,笔记中的部分函数不是自己写的,都是工作中一点点积累的 ...

  3. Python 进程之间共享数据(全局变量)

    进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 if __name__= ...

  4. Apache 的 http-default.conf 详解

    ##Apache 默认设置文件 Timeout 300       #设置服务器在断定请求失败前等待的秒数.默认值 300 KeepAlive Off     #设置是否启用 HTTP 持久链接,On ...

  5. windows上的QT发布

    1. 生成exe 1.1  release 条件下编译 1.2 将QT bin路径加入到path中去 1.3 将1.1生成的exe拷贝到单独的目录,然后cmd到这个目录,使用windeployqt编译 ...

  6. [转载]Quartus ii 一些Warning/Eeror分析与解决

    我会在此基础上继续添加 原文地址:ii 一些Warning/Eeror分析与解决">Quartus ii 一些Warning/Eeror分析与解决作者:yanppf 注:http:// ...

  7. Windows Neovim

      配置文件路径C:\Users\UserName\AppData\Local\nvim\init.vim Vim-plug配置文件路径:C:\Users\UserName\AppData\Local ...

  8. 微信 PHP - SDK 包

    下载 个人公众号谢谢各位老铁支持

  9. Intraweb IIS发布,数据连接问题

    日前,用IW做了小东西,开始用单独的执行程序发布,一切都没有什么问题,但是发布到正式环境中,用windows IIS发布,怎么也获取不了程序所在的物理路径,而后看了万一的博客,试了一下程序能正常运行, ...

  10. div写表格,原生滚动条,数据能够自动滚动

    如何让表格的滚动条能够自动滚动呢? html: <div class="tabinner5"> <div class="tab5 tab5a" ...