2014-09-25 39 views
1

让我们假设我们有一个抽象类,它带有一个打印WARN日志条目的方法(警告:无法设置头文件。已经提交的响应文件),这个方法被类X调用很多次(这是泛滥日志)。如何识别哪个类正在调用特定的方法?

基于从Application Server生成的日志条目,我已经设法识别抽象类并找到它的jar(使用jarscan),JAR是应用程序服务器的OOTB组件,所以它不应该在任何意义上进行修改。我已经砍死JAR和介绍,生成日志条目的方法中的一行:

new Exception().printStackTrace() 

这种做法应该给我堆栈跟踪,以确定类X.

不过,我不知道如何在我的测试环境中重现这个错误,在我的工作区中有很多项目,我不能只检查数百个类来查看哪一个设置了响应对象,我尝试过找到日志条目时间戳和针对测试环境运行的Selenium测试报告之间的匹配,但它不会显示在日志中。

问题:什么是一种很好的故障排除方法来识别X类,而不会对环境造成任何侵入性的变化,从而引发问题?

+3

请参阅Thread.currentThread(),Thread.dumpStack()和Thread.getStackTrace() – ControlAltDel 2014-09-25 12:24:00

+1

可能重复的[什么是调试器,它如何帮助我诊断问题](http://stackoverflow.com/questions/ 25385173/What-is-a-debugger-and-how-can-it-help-me-diagnose-problems) – Raedwald 2014-09-25 12:33:23

+1

使用调试器。 1.在该方法上放置一个断点。 2.运行该程序。 3.当程序在断点处暂停时查看堆栈跟踪。 – Raedwald 2014-09-25 12:34:15

回答

3

如果因为environemnt特定而无法使用调试器,则可以调查加载到服务器JVM中的类并查找从您的抽象类继承的类。

运行jvisualvm并连接到你的服务器的JVM,然后去OQL控制台jvisualvm和运行这样的查询:

select heap.findClass("com.xyz.my.AbstractClass").subclasses() 

这会发现你的抽象类的子类当前加载。

+1

哇,伙计......这真棒 – theMarceloR 2014-09-25 12:39:47

1
public String getMethodName(final int depth) { 
    final StackTraceElement[] ste = Thread.currentThread().getStackTrace(); 
    return ste[depth].getMethodName(); 
} 

用法:

public void doSysOutTest() { 
    String getMetNameFunc = getMethodName(1); 
    String callingMethod = getMethodName(2); 

    System.out.println(getMetNameFunc); 
    System.out.println(callingMethod); 
} 

输出:

getMethodName 
doSysOutTest 

为了获得更多的信息,出栈的,你也可以使用以下方法:

ste[depth].getClassName() 
ste[depth].getFileName() 
ste[depth].getLineNumber() 

看看这里:http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html

相关问题