IDEA进行程序调试方法


       最近发现很多身边的人,在用IDEA进行程序调试时候,没有用到IDEA的强大调试功能,大多数还在用传统的 控制台输出、日志打印方式进行程序的 trouble shooting 。当遇到了多重循环或者 循环比较多的场景,有的同志设置还要改代码才会去定位问题;遇到了多线程代码问题时候更是手足无措。因此整理以下文章,希望对使用IDEA进行JAVA程序开发的同志有所帮助。
       下边内容结合了目前我所遇到的程序开发中所碰到的问题以及所用到的调试技巧,目前主要以下几个方面:

1. 循环调试与方法回退

       如下代码,如果在 i = 10 , j =10 的时候 程序发生了异常,此时需要跟踪 i =10 ,j =10 时候 代码执行区域的逻辑。

@RunWith(SpringRunner.class)
public class RoundCycle {

    @Test
    public void testCycle(){
        for( int i = 0 ; i< 100 ; i++){
            for( int j = 0 ; j < 100 ; j++){
                //TODO Someting Here 调试区域
                System.out.printf("%d %d", i, j);
            }
        }
    }
}

此时,可以利用IDEA提供的 Condition Break Debug 功能,在调试地方点击右键,在condition中输入想要调试的条件即可:
在这里插入图片描述
在这里插入图片描述
如果方法调用层次比较多,在进入到一个方法后,想在回到上一个调用方法中,可以通过Drop Frame功能实现这样的效果。如下图所示:当程序执行到 add方法区时候,点击 对应线程的 Drop Frame,则会回到调用方法栈帧 调用的程序计数器位置当中去,这样就能方便的进行切换以及调用方法上下文的查看。
在这里插入图片描述

2. 多线程调试

缺省情况下IDEA调试仅对主线程有效,如果要对所有线程生效,则需要断点设置为 如下方式。

在这里插入图片描述

如下示例,在下拉框中切换到对应的线程即是对对应线程进行调试,其它线程则处于挂起状态。:

public class ThreadTest implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }

    public static void main(String[] args) {
        for( int i = 0 ; i< 3 ; i++){
            new Thread(new ThreadTest()).start();
        }
    }
}

在这里插入图片描述
线程状态查看以及执行。
在这里插入图片描述

3. 远程调试

远程调试主要用户帮助解决一些只有线上才能复现的问题或者是服务器端运行环境与本地存在较大差异情况,而本地又无法很好复现的情况。以tomcat容器为例,通过idea 新建一个tomcat remote server ,下方的Remote Connection settings为远程需要调试的服务地址和端口。
在这里插入图片描述
这里address是 服务器端开放的远程调试端口,需要在服务器端进行配置。在这里插入图片描述
远程服务器端 配置,需要在catalina.sh 中开启远程访问,并指定访问端口:

CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=60222,suspend=n,server=y"

远程调试主要是通过JDWP协议进行数据网络传输的。JDWP 是 Java Debug Wire Protocol 的缩写,它定义了调试器(debugger)和目标虚拟机(target vm)之间的通信协议。Target vm 中运行着我们要调试的 Java 程序,它与一般运行的 JVM 没有什么区别,只是在启动时加载了 JDWP Agent 从而具备了调试功能。而 debugger 就是我们本地的调试器,它向运行中的 target vm 发送指令来获取 target vm 运行时的状态和控制远程 Java 程序的执行。Debugger 和 target vm 分别在各自的进程中运行,他们之间通过 JDWP 通信协议进行通信。

**注意:**
1 需要保证本地debug的代码与远程部署的代码版本完全、JDK版本尽可能一致,否则断点可能会无法命中。
2 尽量选择在访问不高的时候进行远程调试,否则因为调试过程中,如果访问到了数据库或者锁资源,可能会引起正常业务请求的阻塞或者等待,从而引起一些意想不到的后果,慎用!~

4. http接口调试

通常在进行web开发时候,我们会利用一些接口测试工具如:Postman客户端、Postman chrome插件、Httpwatch工具捕捉 前台对后台的调用请求。这样还需要在接口调用工具和IDEA开发工具之前来回切换,比较麻烦,此时尝试用下 IDEA自带的 HTTP CLEINT插件也能满足接口调用调试的目的。
在这里插入图片描述
可以通过直接在工具中直接 输入 请求地址方式,也可以通过创建或者编辑 Scratches文件方式创建一个请求。有了它,就不用在接口调用工具和开发工具之间来回切换了。但是目前 HttpCliend的 JSON格式返回值没有进行PrettyPrint,所以如果接口返回值内容较多的话,可以通过 左侧栏目中 Open in browser方式打开 进行进一步的分析查看。
在这里插入图片描述

5. 附录:IDEA快捷键大全

可以通过IDEA Help->keymap reference导出成一个pdf,见下图所示;如果有自己比较熟悉的其它工具,如eclipse、netbeans,也可修改自己想要的hot keys.
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值