如何识别哪个类调用特定方法?

时间:2014-09-25 12:20:01

标签: java logging

假设我们有一个带有打印WARN日志条目的方法的抽象类(警告:无法设置标题。响应已经提交),这个方法很多次被类X调用(它是淹没日志)。

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

new Exception().printStackTrace()

这种方法应该给我堆栈跟踪来识别类X.

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

问题:在没有对存在问题的环境进行任何干扰性更改的情况下识别X类的良好故障排除方法是什么?

2 个答案:

答案 0 :(得分:3)

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

运行jvisualvm并连接到服务器的JVM,然后转到jvisualvm中的OQL控制台并运行此类查询:

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

这将找到当前加载的抽象类的所有子类。

答案 1 :(得分: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