一、运行相关
- 运行程序 :
Alt+Shift+F10
- debug 运行 :
Shift+F9
- 停止 :
Ctrl+F2
二、顺序
F8
(Step over)进入下一行代码F9
(Continue)恢复程序运行,但是如果该断点下面代码还有断点则停在下一个断点F7
(Step into)进入方法Alt + F10
(Show Execution Point ) 如果光标在其它行或其它页面,这个快捷键按钮可跳转到当前代码执行的行Alt + F8
计算表达式
三、条件断点
在断点的位置,右击断点标识(小红点),会出来一个界面,在Condition这里填入断点条件即可,这样调试时,就会自动停在满足条件的位置。
四、回退断点
我在 idea 中没有找到回退到上一行的办法,只有回退到前面的某一个调用。
注 : drop frame 简单地翻译就是扔掉当前运行的栈帧,由于运行的方法 jvm 都会存储到栈里面,扔掉当前方法在栈中的栈帧,那么当前指针的位置就到了上一帧的位置。
五、强制返回
有时候,当传入的参数有误后,不想走后面的流程了,怎么中断这次请求呢(后面的流程要写数据库数据),关闭应用,这个算一种,还可以通过 Force Return 来强制返回来避免后续的流程。
六、debug 中修改变量的值
选中变量,右击选择 set value, 如下:
七、远程 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
:
然后配置远程服务 :
这里是使用 socket 通讯,一些其他配置可以参考 : https://www.jetbrains.com/help/idea/run-debug-configuration-remote-debug.html
然后在 idea 顶部导航栏 : Run ==> 47.xx.xx.xx-remote(前面配置的远程debug服务名称)
:
运行上面的远程调用后,就可以在 debug 栏看到连接:
在本地源码打上 debug 断点,然后调用服务器上的接口,就可以看到进入本地的断点了。