文档章节

Idea Intellij多线程调试

群星纪元
 群星纪元
发布于 2017/11/08 10:57
字数 566
阅读 88
收藏 0

(适用Idea 14 & 15,其他版本未知)

几天前遇到一个问题: 
在多线程调试的时候,一些断点会被跳过。

比如像下面的代码:

public static void main(String[] args) throws InterruptedException {
    new Thread() { // 断点0
        @Override
        public void run() {
            System.out.println("1"); // 断点1
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("2"); // 断点2
        }
    }.start();
    // 外线程
    System.out.println("3"); // 断点3
    Thread.sleep(2000);
    System.out.println("4"); // 断点4
}

启动调试后,可能会命中断点1或者断点3,命中路径可以是3->2->4或者3->4甚至3->2,总之并不会命中全部断点。在单步调试的过程中,代码的执行速度事实上远比直接运行慢得多,所以我加入了一些sleep用来模拟这些延迟的过程。

这段代码一共有两个线程,在调试一个线程的过程中,很显然另一个线程是在运行的。所以我们可以猜测是不是Idea是不是会在我们调试一个线程时,屏蔽另一个线程的断点。 
为了验证这个观点,只需要在命中断点0处之后单步,就会到断点3,然会你调试得“慢”一点,就会发现断点1和2被跳过了。

这里写图片描述 
打钩的是我当前调试的线程(main线程),当你开始单步调试之后,这个堆栈会刷新。

这显然是不能接受的,对于多线程调试来说,最重要的就是控制两个线程的执行顺序,我们要做的其实就是当另一个不处于调试状态的线程命中断点后,能先暂停,一直等到我去处理为止。

经过一番折腾后发现,其实Idea提供了这个功能,在断点处右键 
这里写图片描述 
它提供了两种挂起的模式,默认的是All,只需要选中Thread,它就会一直等待到你处理它。 
右边的Make Default功能会使得之后打上的断点也会是Thread模式的(注意,之前打上的不会变更,需要手工更改)。 
这里写图片描述 
两个红圈的按钮就可以改,在Debug窗口的最右边。

之后就可以开心地调试了,对了,在这里切换线程 
这里写图片描述

本文转载自:http://blog.csdn.net/fuzzytalker/article/details/50925218

群星纪元
粉丝 45
博文 456
码字总数 44497
作品 0
朝阳
高级程序员
私信 提问
探秘IntelliJ IDEA 13测试版新功能——调试器显示本地变量

IntelliJ IDEA在业界被公认为最好的Java开发平台之一,JetBrains公司将在12月正式发布IntelliJ IDEA 13版本。 现在,小编将和大家一起探秘密IntelliJ IDEA 13测试版本新功能——调试器显示本...

kouxunli1
2013/10/23
2.2K
2
IntelliJ IDEA 14全面来袭

JetBrains(目前其产品正年终促销)正式发布了IntelliJ IDEA 14(8折优惠)版本,新的IntelliJ IDEA全面提高了编辑、学习、调试的能力。具体变化如下: Decompiler IntelliJ IDEA 14带有一个...

kouxunli1
2014/11/26
827
2
Intellij Idea编辑调试Lua

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wwlcsdn000/article/details/80572683 Intellij Idea编辑调试Lua 之前我整理了关于Intellij Idea以及EmmyLua...

那远远的云端
2018/06/04
0
0
IntelliJ IDEA 2019.1 正式发布,“JetBrains 全家桶”齐更新

IntelliJ IDEA 2019.1 现已正式发布,作为今年的首个重大更新版本,2019.1 带来了许多新功能和改进,下面不妨来看看主要概述。 可通过官网下载 IntelliJ IDEA 2019.1 的最新安装包来升级,也...

局长
03/28
83.1K
111
使用IntelliJ IDEA进行远程调试

远程调试服务器是一个比较实用的技巧,以便我们能够迅速定位线上问题。本文会介绍如何在IntelliJ IDEA中进行远程调试。 配置IntelliJ IDEA 选择Edit Configurations ——>+号(Add New Confi...

JackieYeah
2015/11/01
25.6K
1

没有更多内容

加载失败,请刷新页面

加载更多

网站安全维护公司对渗透测试php后门分析

很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全...

网站安全
6分钟前
1
0
在github上创建代码仓库时忘记添加.gitignore文件或修改了.gitignore该怎么办?

#清除本地缓存(改变成未track状态) #git rm -r --cached . 表示清除项目中所有文件的本地缓存 git rm -r --cached xxx #xxx表示不想版本控制的文件,比如小编可以输入test.o #.gitignore中的...

博爱飞扬
6分钟前
1
0
Fsimage 与 EditLog定义及合并过程

有很多客户端在向 hdfs 中写数据,同时有很多客户端在查数据,这就涉及到一个响应速度问题。因为只有一个 namenode ,客户端在写的时候,必须迅速记下来。 1. 向 namenode 询问可以存储到哪些...

Garphy
10分钟前
2
0
TI KeyStone C66x开发板处理器、NAND FLASH、NOR FLASH

TL6678F-EasyEVM是广州创龙基于SOM-TL6678F核心板而研发的一款多核高性能DSP+FPGA开发板。开发板采用核心板+底板方式,底板采用沉金无铅工艺的8层板设计,尺寸为247.33mm*139.8mm,它为用户提...

Tronlong创龙
27分钟前
3
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第13题

Choose the best answer. Examine this query: SELECT TRUNC (ROUND(156.00,-2),-1) FROM DUAL; What is the result? A) 16 B) 160 C) 150 D) 200 E) 100 Answer:D (解析:关键就是 round ......

oschina_5359
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部