2014-09-25 4 views
1

Предположим, что у нас есть абстрактный класс с методом, который печатает запись WARN log (ПРЕДУПРЕЖДЕНИЕ: невозможно установить заголовок. Ответ уже сделан), этот метод вызывается классом X много раз (это наводнение журналов).Как определить, какой класс вызывает конкретный метод?

Основываясь на записи журнала, которая была сгенерирована на сервере приложений, мне удалось идентифицировать абстрактный класс и найти его банку (используя jarscan), JAR - это компонент OOTB сервера приложений, поэтому он не должен быть изменен в любом смысле. Я взломал БАНКУ и ввел линию в методе, который генерирует запись журнала:

new Exception().printStackTrace() 

Этот подход должен дать мне трассировки стека для определения класса X.

Однако, я не знаю, как чтобы воспроизвести эту ошибку в моей тестовой среде, есть много проектов, которые у меня нет в моей рабочей области, и я не могу просто проверить сотни классов, чтобы увидеть, какой из них что-то устанавливает в объект ответа, я попытался найти совпадение между метками времени журнала и отчетами о тестировании Selenium, которые работают с тестовой средой, но не отображаются в журналах.

Вопрос: Что было бы хорошим способом устранения неполадок для определения класса X без каких-либо навязчивых изменений в среде, которая представляет проблему?

+3

см. Thread.currentThread(), Thread.dumpStack() и Thread.getStackTrace() – ControlAltDel

+1

Возможный дубликат [Что такое отладчик и как он может помочь мне диагностировать проблемы] (http://stackoverflow.com/questions/ 25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems) – Raedwald

+1

Используйте отладчик. 1. Поместите точку останова на метод. 2. Запустите программу. 3. Посмотрите на стек, когда программа остановится в точке останова. – Raedwald

ответ

3

Если вы не можете использовать отладчик из-за специфики вашей среды, вы можете исследовать классы, загруженные в JVM вашего сервера, и найти классы, которые наследуются от вашего абстрактного класса.

Run jvisualvm и подключиться к JVM вашего сервера, а затем перейти к OQL консоль в jvisualvm и запустить такой запрос:

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

Найдет все подклассы вашего абстрактного класса в настоящее время загружены.

+1

Ничего себе, чувак ... это потрясающе – theMarceloR

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

Смежные вопросы