【问题标题】:Step into Java EE code in Eclipse在 Eclipse 中进入 Java EE 代码
【发布时间】:2012-10-26 16:07:32
【问题描述】:

在 Eclipse 和 Java EE 代码中调试会话很痛苦,我希望有人有比我更好的方法。

这是 2 个 EJB 无状态 bean 方法之间的典型调用堆栈(使用 TomEE 1.0):

NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$BeanInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181   
ReflectionInvocationContext.proceed() line: 163 
StatsInterceptor.record(InvocationContext, Method) line: 176    
StatsInterceptor.invoke(InvocationContext) line: 95 
GeneratedMethodAccessor35.invoke(Object, Object[]) line: not available  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$InterceptorInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181    
ReflectionInvocationContext.proceed() line: 163 
CdiInterceptor.invoke(InvocationContext) line: 129  
CdiInterceptor.access$000(CdiInterceptor, InvocationContext) line: 45   
CdiInterceptor$1.call() line: 66    
CdiInterceptor.aroundInvoke(InvocationContext) line: 72 
GeneratedMethodAccessor34.invoke(Object, Object[]) line: not available  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
ReflectionInvocationContext$InterceptorInvocation(ReflectionInvocationContext$Invocation).invoke() line: 181    
ReflectionInvocationContext.proceed() line: 163 
InterceptorStack.invoke(Object...) line: 138    
StatelessContainer._invoke(Method, Method, Object[], Instance, ThreadContext, InterfaceType) line: 226  
StatelessContainer.invoke(Object, InterfaceType, Class, Method, Object[], Object) line: 178 
StatelessEjbObjectHandler(EjbObjectProxyHandler).synchronizedBusinessMethod(Class<?>, Method, Object[], Object) line: 260   
StatelessEjbObjectHandler(EjbObjectProxyHandler).businessMethod(Class<?>, Method, Object[], Object) line: 240   
StatelessEjbObjectHandler(EjbObjectProxyHandler)._invoke(Object, Class, Method, Object[]) line: 91  
StatelessEjbObjectHandler(BaseEjbProxyHandler).invoke(Object, Method, Object[]) line: 284   
MyService$LocalBeanProxy.removeScheduledEvent(ScheduledEvent) line: not available   

这是我不想检查的 30 行 Java EE 管道方法调用!

当单步执行一个方法时,我唯一可靠的跳过所有这些的方法是在下一个方法调用中放置一个断点,然后点击“Step Over”而不是“Step Into”。然而,与简单的“Step Into”相比,像这样一直设置断点是一个很大的麻烦。当我需要退出我正在检查的方法时,我必须重复同样的事情。

我知道 Eclipse 中的步骤过滤器并尝试使用这些过滤器,但是一些自动生成的代理类被注入到我自己的包中,所以我不能轻易使用它。

有人对此有好的解决方案吗?

更新

使用以下步骤过滤器暂时跳过所有不需要的步骤:

*$$*  // for CGLib proxies
*$LocalBeanProxy  // for other EJB proxies
java.*
net.sf.*
sun.*

编辑 2

这是 MyService 类的一个示例:

public void removeScheduledEvent(ScheduledEvent event) {
    // ...
    otherEJB.doStuff(event);
}

由于 otherEJB 是在无状态容器中运行的 EJB bean,因此上面的 30 个调用是通过代理自动插入的。

【问题讨论】:

    标签: java eclipse debugging jakarta-ee


    【解决方案1】:

    关于 Eclipse 步骤过滤器的一些信息:

    Eclipse debugging / step into method skipping AOP wiring

    How to filter dynamically generated classes in debug view?

    我在 TomEE 中使用的实际步骤过滤器:

    *$LocalBeanProxy
    *$CGLibInterceptor
    net.sf.*
    org.apache.geronimo.*
    org.apache.naming.*
    org.apache.openejb.*
    org.apache.tomee.*
    org.apache.webbeans.*
    

    【讨论】:

      【解决方案2】:

      调试时,只需按住CtrlAlt,再次将鼠标悬停在要停止的方法名称上,直到变成超链接,然后单击方法名称。该功能称为Step into Selection

      【讨论】:

      • 感谢分享这个技巧;我不知道。但是,这并没有跳过我自己的 2 个方法之间的 30 多个中间步骤。
      • 如果是这样,步骤过滤器可能是您唯一的解决方案。我只在像 mockito 这样的模拟框架中看到过这种不需要的行为,并且添加步骤过滤器足以跨过模拟框架的每个“神奇”生成的方法。还是您的那个框架使用字节码操作?这可能会让事情变得更加困难。
      【解决方案3】:

      代码+测试(只是运行,而不是设置断点)增量。异常堆栈在 EE 中通常是无用的。

      【讨论】:

      • 有时可以。在像我这样更复杂的场景中,我发现单步执行代码以找出异常的原因要容易得多。
      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 2011-01-14
      • 2016-03-30
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多