idea断点调试(打印断点调用栈)

本文介绍了IntelliJ IDEA的断点调试技巧,包括设置条件表达式、打印堆栈信息、表达式解析、避免操作资源时强制返回、快捷键使用、stream调试等内容,还提醒了方法断点过多会影响调试速度及项目启动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.条件表达式

右键断点写表达式条件后点击done,debug满足条件才会停在此断点。

Thread.currentThread().getName().equals("thread1")

2.打印堆栈信息

右键断点点击more,打开详情

勾选log旁边的 "Breakpoint hit" message (断点触发信息)和 Stack trace(堆栈信息)

输出效果,如果方法被多个类调用时,Stack trace 可以清楚地看到具体的调用类

3.表达式解析

当运行到断点时点击Evaluate Expression...,填写表达式,点击evaluate计算result

比如有许多if else 判断,那么可以用这个实时解析出最后程序走哪个分支

4.避免操作资源 force return

场景:在操作数据库等资源之前发生了错误,不想让程序继续执行,

如果点drop frame,是回到调用方法前,是错误的

应该在frame面板中右键当前方法,点击force return,执行完断点那行就会跳出了。

5.快捷键图标、含义

当代码很长时,断点过程中,光标停在其他位置,show execution point 会回到断点处。

step over 跳过当前行,会到下一行

step into  进入方法

force step into  强制进入方法,进入jar包里的

step out  跳出方法

run to cursor 当代码很长时,断点可以直接跳到光标位置

6.stream 调试

j8里流式编程,打断点时可以选择打在哪里,不过我操作时没有出现(和视频里不一样,可能版本问题,关系不大)

追踪当前stream链式调用,(split mode)会显示每个步骤数据的变化,下面的flat mode 可以一次显示所有变化

7.注意点

打在方法上的断点太多,项目会启动不了,idea会给出提示:

方法断点可能会明显降低调试速度

Method breakpoints may dramatically slow down debugging 

参考的视频:IDEA 断点调试高级玩法 |debug高手必看! #71_哔哩哔哩_bilibili

### 如何在过滤器中设置断点进行调试 #### Java Servlet Filter 中的断点调试 对于Java Servlet Filter,在Eclipse或IntelliJ IDEAIDE中可以方便地为Filter类的方法设置断点。具体操作是在`doFilter()`方法内部点击左侧行号处,创建一个断点。 ```java public class MyServletFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; // 设置断点在此处 System.out.println("Processing request for " + httpRequest.getRequestURI()); chain.doFilter(request, response); } } ``` 当应用程序运行并触发此过滤器时,程序执行会暂停于所设断点位置,允许开发者检查变量状态、调用堆栈以及逐步跟踪代码逻辑[^1]。 #### Spring Security 过滤器链中的断点调试 针对Spring Security配置下的自定义过滤器,比如`WebAsyncManagerIntegrationFilter`,同样可以在实现此类的具体方法内设定断点: ```java @Bean SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http .addFilter(new WebAsyncManagerIntegrationFilter() { @Override protected void beforeInvocation(HttpServletRequest request) { super.beforeInvocation(request); // 断点可放置于此 logger.debug("Before invocation of async manager integration"); } @Override protected void afterInvocation(HttpServletRequest request, HttpServletResponse response, Object handler) { super.afterInvocation(request, response, handler); // 或者此处 logger.info("After invocation processing completed."); } }) .build(); } ``` 一旦应用启动并且有HTTP请求经过该过滤器,则会在指定的位置停止以便进一步分析。 #### 使用 `FilterRegistrationBean` 注册的过滤器调试 如果采用`FilterRegistrationBean`来注册带有`@WebFilter`注解的过滤器实例,那么可以直接在这个被代理的真实过滤器对象上的适当位置加入断点。例如: ```java @Configuration public class AppConfig { @Bean public FilterRegistrationBean<MyCustomFilter> loggingFilter(){ FilterRegistrationBean<MyCustomFilter> registrationBean = new FilterRegistrationBean<>(); MyCustomFilter customFilter = new MyCustomFilter(); // 可以在这里打断点查看customFilter初始化情况 registrationBean.setFilter(customFilter); registrationBean.addUrlPatterns("/api/*"); return registrationBean; } } class MyCustomFilter extends OncePerRequestFilter{ @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { try { // 此处也可以设置断点 String param = request.getParameter("exampleParam"); if ("DEBUG".equals(param)) { throw new RuntimeException("Debug exception occurred!"); } filterChain.doFilter(request,response); } catch(Exception e){ log.error(e.getMessage(),e); } } } ``` 这样不仅能够监控过滤器本身的运作流程,还可以观察到由`FilterRegistrationBean`管理的相关属性和行为[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值