一、运行相关

  1. 运行程序 : Alt+Shift+F10
  2. debug 运行 : Shift+F9
  3. 停止 : Ctrl+F2

二、顺序

  1. F8 (Step over)进入下一行代码
  2. F9 (Continue)恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点
  3. F7 (Step into)进入方法
  4. Alt + F10 (Show Execution Point ) 如果光标在其它行或其它页面,这个快捷键按钮可跳转到当前代码执行的行
  5. Alt + F8 计算表达式

三、条件断点

在断点的位置,右击断点标识(小红点),会出来一个界面,在Condition这里填入断点条件即可,这样调试时,就会自动停在满足条件的位置。

java退出idea会关闭线程 idea如何退出debug_java退出idea会关闭线程

四、回退断点

我在 idea 中没有找到回退到上一行的办法,只有回退到前面的某一个调用。

java退出idea会关闭线程 idea如何退出debug_spring_02

注 : drop frame 简单地翻译就是扔掉当前运行的栈帧,由于运行的方法 jvm 都会存储到栈里面,扔掉当前方法在栈中的栈帧,那么当前指针的位置就到了上一帧的位置。

五、强制返回

有时候,当传入的参数有误后,不想走后面的流程了,怎么中断这次请求呢(后面的流程要写数据库数据),关闭应用,这个算一种,还可以通过 Force Return 来强制返回来避免后续的流程。

java退出idea会关闭线程 idea如何退出debug_jar_03

六、debug 中修改变量的值

选中变量,右击选择 set value, 如下:

java退出idea会关闭线程 idea如何退出debug_ide_04

七、远程 debug

只要有源代码,本机不启动,可以在本机调试远程服务器上的代码。需要有源代码,并且本机允许访问远程端口。

远程调试方法,在服务器启动时,在 -jar 或者 ${main_class} 前面添加参数 :

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=debug端口

创建一个简单的 springboot 项目,提供一个接口:

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * MyTestController
 *
 * @author xiaohe
 */
@Slf4j
@RestController
@RequestMapping("/test")
public class MyTestController {

    @GetMapping("debug")
    public String testDebug() {
        log.info("start debug.");
        int ran = (int) (Math.random() * (50) + 5);
        for (int i = 0; i < ran; i++) {
            log.info("the current index is : [{}]", i);
        }
        log.info("end debug.");
        return "success";
    }

}

把项目部署到外网服务器去,启动命令:

nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar xxx.jar &

然后在本机中设置远程调试:

idea顶部导航栏Run ==> Edit Configurations :

java退出idea会关闭线程 idea如何退出debug_jar_05

然后配置远程服务 :

java退出idea会关闭线程 idea如何退出debug_java退出idea会关闭线程_06

这里是使用 socket 通讯,一些其他配置可以参考 : https://www.jetbrains.com/help/idea/run-debug-configuration-remote-debug.html

然后在 idea 顶部导航栏 : Run ==> 47.xx.xx.xx-remote(前面配置的远程debug服务名称) :

java退出idea会关闭线程 idea如何退出debug_jar_07

运行上面的远程调用后,就可以在 debug 栏看到连接:

java退出idea会关闭线程 idea如何退出debug_spring_08

在本地源码打上 debug 断点,然后调用服务器上的接口,就可以看到进入本地的断点了。