代码之家  ›  专栏  ›  技术社区  ›  Jerome Cance

如何知道一个春天生成的bean中的bug行?

  •  5
  • Jerome Cance  · 技术社区  · 16 年前

    我用Spring和JPA(Hibernate)建立了一个网站。我有一个bug,我不知道如何识别bug出现的行。

    我不能在我的IDE上调试它,因为它是一个实时版本(在本地运行都很好)。

    我有日志,上面写着: o

    rg.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)#012#011
    
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:625)#012#011
    
    at com.mycompany.server.rpc.UserService$$EnhancerByCGLIB$$64ed2d4f.createAccount(<generated>)#012#011
    
    at com.mycompany.server.rpc.ServiceRPCImpl.createAccount(ServiceRPCImpl.java:309)
    

    我的问题是第三行。由于UserService对象是由Spring处理的,所以它变成了一个代理,我不知道bug的内容。

    你知道怎么解决这个问题吗?

    谢谢

    3 回复  |  直到 16 年前
        1
  •  3
  •   Sean Patrick Floyd    16 年前

    您是否可以从cglib更改为jdk代理?( Spring AOP proxy reference )

    基本上:如果您将bean作为接口访问,那么您可以使用JDK代理(Spring默认机制),从而使底层对象保持完整,并获得对堆栈跟踪中行号的访问。

        2
  •  0
  •   mdma    16 年前

    我会说,不能在本地复制这是一个重要的限制。我将尝试设置本地环境或测试服务器来重现问题,使用JMeter或其他负载测试软件来模拟并发用户访问的负载。完成后,您的调整/编译/测试周期将缩短很多,您可以进行实验性的更改,而不用担心中断生产服务器上的服务。这看起来可能很费力,但这项工作不仅会为这个bug带来回报,而且会为将来可能遇到的bug带来回报。

    这听起来像是一个线程错误,特别是因为Spring默认使用单例作用域。考虑到这一点,考虑为失败的服务创建多线程集成测试。一旦您通过负载测试重现了这个bug,您就可以通过使您的主要服务方法来验证它是否是线程bug。 synchronized ,防止同时使用。如果bug消失,则很可能是并发bug。

    至于查找bug的行,因为代码是生成的,所以没有要查找的行。你能做的最好的事情就是在用户服务的建议中使用的所有bean中添加防御检查。(例如,检查由于缺少注入而导致的空值。) init-method bean上的属性对于执行检查bean是否已完全构造以及是否已设置了所有必需的合作者非常有用。

        3
  •  0
  •   Harsha Hulageri    16 年前

    如果您无法在本地环境中重现该问题,那么可能是与环境/网络相关的问题。我将首先在测试环境中重新创建这个问题(它更接近于生产环境,而不仅仅是拥有本地机器)来调试bug。

    您也可以使用fiddler调试与网络相关的实时版本问题。