重叠的堆栈跟踪

时间:2013-11-15 13:59:57

标签: java stack-trace

我想在这里做点什么:我的应用程序http://statistics.netbeans.org/analytics/detail.do?id=204003

netbeans团队自动知道他们获得的报告是否是一些新错误,或者是否有重复错误。

假设我有以下异常。

Caused by: javax.ejb.EJBException
    at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:3894)
    at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3794)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3596)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1379)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1316)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:205)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:83)
    at com.sun.proxy.$Proxy99.getProjectsBySearchCriteria(Unknown Source)
                     ^
                     here is $Proxy99 I told about

    at my.project.crm.web.controllers.contacts.ContactDetailsController.updateUndeletedProjectCollection(ContactDetailsController.java:2666)
    at my.project.crm.web.controllers.contacts.ContactDetailsController.init(ContactDetailsController.java:489)
    ... 83 more
Caused by: java.lang.NullPointerException
    at my.project.utils.security.UserRights.(UserRights.java:182)
    at my.project.utils.security.AbstractSecurity.(AbstractSecurity.java:26)
    at my.project.utils.security.ProjectSecurity.(ProjectSecurity.java:138)
    at my.project.crm.enterprise.facades.projects.ProjectFacadeImpl.getProjectsBySearchCriteria(ProjectFacadeImpl.java:637)
    at sun.reflect.GeneratedMethodAccessor6373.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1011)
    at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:175)
    at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2920)
    at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4011)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:197)
    ... 87 more

我想我可以通过以下几个步骤制作某种签名:

  • 删除任何不以
  • 开头的行
  • 删除行号(这样我的应用程序的不同版本不会有问题)
  • 在更复杂的情况下(依赖注入)将一些奇怪的名称(如$ Proxy99)更改为某些标准名称
  • 从结果
  • 制作一些md5

这样我在应用程序中得到了某种bug的签名

有没有更简单的方法呢?

1 个答案:

答案 0 :(得分:3)

我不知道这个问题是否可以有一个正确的答案,但这里有一些关于你的观点的想法:

  • 不要删除任何行。一切都很重要
  • 即使是相等检查,也不要删除行号。如果要处理不同版本,请将实际版本添加到报表中并手动对重复项进行排序。您可以使用没有行号的版本来检测可能的重复项,但我会一直手动查看。
  • 如果要以编程方式比较堆栈跟踪,那些代理名称可能会成为问题。重命名它们将是一个解决方案,但请注意,重命名后,具有相同ID的两个代理仍需要具有相同的名称。它需要一个复杂的解析器才能做到这一点。
  • 始终比较整个堆栈跟踪而不仅仅是哈希值。哈希值不是无冲突的。虽然碰撞不是很可能,但仍然会发生错误解释两个不同的堆栈跟踪的情况。如果您担心性能:在这种情况下,这应该不是问题。

最后,我要说一下ThrowableException的Java API,特别是getStackTrace()。我自己也不喜欢它,但也许你可以用它来编辑和比较你的堆栈跟踪,而不必做复杂的字符串魔术。