在调试模式下,一旦我在一个方法中完成调试,并且需要返回调用者,程序就会卡住,因为它进入外部库代码的逻辑,即spring框架的MethodProxy,如截图所示,我不能继续进入我自己的代码。 'stuck'意味着它进入spring框架的代码,即MethodProxy,而不是我自己的代码,我的方法的调用者。
同样,如果我的调试逻辑试图输入另一个方法,它会输入spring frameworks的代码,即CglibAopProxy。我不知道是什么造成的。我以前能够调试我的代码,但不知道为什么以及如何发生这种情况。
我在Spring-boot中开发并使用IntelliJ IDE。
当我尝试调试方法时,发生了这种情况:
当我试图回到来电者时,发生了这种情况:
答案 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
方法。
如果您要调用调用方法(但不知道调用它的位置),请在调试窗口中检查帧
在那里,您可以找到调用堆栈,并从中选择继续调试应用程序的位置。 (库代码通常以黄色突出显示)
然后在当前方法调用后将断点放到下一行并按F9(恢复程序)
您可以选择将光标放在所需的行上并按“运行到光标”(Alt + F9或Option + F9)
答案 1 :(得分:1)