2014-09-25 70 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

相關問題