Отслеживание «скрытых» исключений - PullRequest
4 голосов
/ 30 мая 2011

Я проверяю вывод моей программы, где время от времени я вижу сообщение типа «java.lang.NullPointerException» и ничего больше. Поскольку это не из моего кода, я уверен, что есть какая-то сторонняя библиотека, в которой какой-то придурок сделал что-то вроде: catch (ex) {println ex.getMessage ()}.

Есть ли способ повторно включить отчеты о трассировке стека и посмотреть, где происходит проблема? Это не легко сделать с помощью отладчика + пошаговое выполнение, так как проблема возникает случайным образом, когда я запускаю программу на большом наборе входных данных, в то время как я не могу воспроизвести ее, если я пытаюсь перезапустить фрагмент данных, который выглядит виновным.

Заранее спасибо!

Ответы [ 2 ]

5 голосов
/ 30 мая 2011

Обновление: Лучше использовать точку останова IDE, за исключением обнаруженного вами.

В противном случае вы можете установить пользовательский PrintStream через System.setOut(..) и там, когда что-то печатается, также печатать Thread.currentThread().getStackTrace()

В идеале ваш PrintStream должен просто обернуть оригинал System.out и отправить к нему. Что-то вроде:

public class PrintStreamWrapper extends PrintStream {
    public PrintStreamWrapper(OutputStream out) {
       super(out);
    }

    public void println(String x) {
         StackTraceElement[] trace = Thread.currentThread().getStackTrace();
         // print everything, but not to the System.out, 
         // because you'll end up in a loop.
         super.println(x);
    }   
}

А затем, в начале вашей программы:

System.setOut(new PrintStreamWrapper(System.out));
1 голос
/ 30 мая 2011

Не видя код, сложно сказать.Если часто выдается исключение, компилятор HotSpot может фактически оптимизировать окружающий код настолько, что виртуальная машина не сможет генерировать правильную трассировку стека, а Exception # printStackTrace () будет печатать только имя класса исключения и сообщение.

Прежде чем делать что-либо еще, я бы попытался запустить ваше приложение с аргументом VM -XX: -OmitStackTraceInFastThrow, чтобы заставить виртуальную машину создать правильную трассировку стека для всех исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...