【问题标题】:Can't enter a method in debugging mode in IntelliJ?无法在 IntelliJ 的调试模式下输入方法?
【发布时间】:2018-05-26 02:20:03
【问题描述】:

在调试模式下,一旦我在一个方法中完成调试,需要返回调用者,程序就卡住了,因为它进入了外部库的代码逻辑,即spring框架的MethodProxy,如截图所示,我不能继续进入我自己的代码。 'stuck' 意味着它进入了 spring 框架的代码,即 MethodProxy,而不是我自己的代码,我的方法的调用者。

同样,如果我的调试逻辑尝试进入另一个方法,它会进入 Spring 框架的代码,即 CglibAopProxy。我不知道是什么原因造成的。我过去能够调试我的代码,但不知道为什么以及如何发生这种情况。

我正在 Spring-boot 中开发并使用 IntelliJ IDE。

当我尝试调试一个方法时,发生了这种情况:

当我试图返回调用者时,发生了这种情况:

【问题讨论】:

  • 程序卡住是什么意思?你正在设置新的断点,它并没有停在那里?
  • @ArtemPetrov,请查看我的更新。原来和多线程无关。

标签: java spring multithreading intellij-idea


【解决方案1】:

您可以设置步进过滤器,以便调试器在步进时不会停在那里。

例如可以添加org.springframework.*:

对于开箱即用的弹簧包,有IDEA-143338 和几个相关问题。

【讨论】:

    【解决方案2】:

    对于 Spring,为用户的 bean 创建代理对象(例如托管事务)是绝对正常的。因此,当您似乎正在从您的类方法调用另一个您的类但中间实际上将执行一些其他代码时,这是绝对正常的。

    如果您要从代码调用方法的地方继续调试,那么对我来说最简单的方法是在调用行之后在调用者方法中放置断点。

    例子:

    你有一个应用程序:

    package pkg;
    
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Repository;
    
    @SpringBootApplication
    public class Main {
    
        public static void main(String... args) {
            SpringApplication.run(Main.class);
        }
    }
    
    @Component
    class MyTask implements ApplicationRunner {
        private final MyRepository repository;
    
        public MyTask(MyRepository repository) {
            this.repository = repository;
        }
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            repository.doIt();
            System.out.println("........");
        }
    }
    
    @Repository
    class MyRepository {
        public void doIt() {
            System.out.println("...");
        }
    }
    

    而你恰好调试了MyRepository.doIt 方法。

    如果你去你的调用者方法(但不知道它在哪里被调用)检查调试窗口中的框架

    您可以在此处找到调用堆栈,并从中选择要继续调试应用程序的内容。 (库代码通常用黄色突出显示)

    然后将断点放在当前方法调用后的下一行,然后按 F9(恢复程序)

    您可以选择将光标放在所需的行上,然后按“运行到光标”(Alt+F9 或 Option+F9)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多