在IntelliJ中无法在调试模式下输入方法?

时间:2018-05-26 02:20:03

标签: java spring multithreading intellij-idea

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

同样,如果我的调试逻辑试图输入另一个方法,它会输入spring frameworks的代码,即CglibAopProxy。我不知道是什么造成的。我以前能够调试我的代码,但不知道为什么以及如何发生这种情况。

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

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

enter image description here

当我试图回到来电者时,发生了这种情况:

enter image description here

2 个答案:

答案 0 :(得分: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方法。

enter image description here

如果您要调用调用方法(但不知道调用它的位置),请在调试窗口中检查帧

enter image description here

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

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

enter image description here

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

答案 1 :(得分:1)

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

例如,您可以添加org.springframework.*

stepping filtersIDEA-143338和几个相关的问题可以解决弹簧包的问题。