假设我们有一个带有打印WARN日志条目的方法的抽象类(警告:无法设置标题。响应已经提交),这个方法很多次被类X调用(它是淹没日志)。
根据从Application Server生成的日志条目,我设法识别抽象类并找到它的jar(使用jarscan),JAR是应用程序服务器的OOTB组件,所以它不应该是在任何意义上修改。我已经攻击了JAR并在生成日志条目的方法中引入了一行:
new Exception().printStackTrace()
这种方法应该给我堆栈跟踪来识别类X.
但是,我不知道如何在我的测试环境中重现此错误,我的工作区中有很多项目没有,我只能检查数百个看看哪一个正在设置响应对象的类,我试图找到日志条目时间戳和针对测试环境运行的Selenium测试报告之间的匹配,但它没有显示在日志中。
问题:在没有对存在问题的环境进行任何干扰性更改的情况下识别X类的良好故障排除方法是什么?
答案 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