Недавно я обнаружил ошибку, которая вызывает исключение NullPointerException. Исключение попадает и регистрируется с помощью стандартного оператора slf4j. Сокращенный код ниже:
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Как вы можете видеть, ничего необычного. Однако из всех операторов ведения журнала исключения, которые у нас есть, только этот не распечатывает трассировку стека. Все, что он печатает, - это сообщение (представленное как "..." ) и имя класса исключения (java.lang.NullPointerException).
Так как трассировка стека на исключении ленив загружена, я подумал, что, возможно, есть проблема с переупорядочением команд, и решил вызвать e.getStackTrace() перед оператором журнала. Это не имело значения.
Итак, я решил перезапустить с включенным средством отладки. Однако, поскольку я даже привязался к процессу, я заметил, что теперь трассировки стека печатаются. Таким образом, присутствие агента отладки вызвало дополнительную информацию об отладке.
С тех пор я установил основную причину исключения. Но я хотел бы узнать, почему трассировка стека была недоступна без отладчика. Кто-нибудь знает?
Уточнение: это не проблема ведения журнала. Представьте себе одно и то же предложение try/catch, но в catch, я печатаю значение:
e.getStackTrace().length
Без отладчика это печатает "0", а отладчик печатает положительное число (в данном случае - 9).
Дополнительная информация: это происходит на JDK 1.6.0_13, 64bit, amd64, linux 2.6.9