Отслеживание стека NullPointerException, не доступное без агента отладки

Swift 4 через расширение, обрабатывает пустой вид таблицы:

extension UITableView {
    func scrollToTop(animated: Bool) {
        self.setContentOffset(CGPoint.zero, animated: animated);
    }
}
58
задан omerkudat 2 July 2009 в 19:53
поделиться

3 ответа

Возможно ли, что этот код находится во внутреннем цикле? Затем JIT-компилятор может компилировать стек вызовов для этого в собственный код, теряя информацию о стеке. Затем, когда вы присоединяете отладчик, он отключает JIT, снова делая информацию доступной.

Другие ручные исключения продолжают отображать информацию, поскольку JIT не оптимизирует.

Похоже, что это иногда может случиться с другими из комментария в исходном коде этого класса в строке 102:

http://logging.apache.org/log4j/1.2/xref/org/apache/log4j/spi/LocationInfo.html

19
ответ дан 24 November 2019 в 18:54
поделиться

Я могу воспроизвести это, но кажется странным, что это происходит где-то в вашем действии.

Если вы вызовете setStackTrace с пустым массивом, будет показан только текст.

 public class Fark {
   public static void main(String[] args) {
       try {
           Fark.throwMe(args.length != 0);

       }
       catch (Exception e) {
           e.printStackTrace();
       }

   }

     public static final void throwMe(boolean arg) throws Exception{
         Exception e = new NullPointerException();
         if (arg) {
           e.setStackTrace(new StackTraceElement[0]);
         }
         throw e;
     }
 }

Запуск ....

% java Fark
java.lang.NullPointerException
        at Fark.throwMe(Fark.java:15)
        at Fark.main(Fark.java:5)

% java Fark nothing
java.lang.NullPointerException
0
ответ дан 24 November 2019 в 18:54
поделиться

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

Для получения дополнительной информации, пожалуйста, ознакомьтесь с следующими заметками выпуска:

«Компилятор на сервере VM теперь предоставляет правильные задние задницы для всех« холодных »встроенных исключений. Для целей производительности, когда такое исключение Обрасывает несколько раз, метод может быть перекомпилирован. После перекомпиляции компилятор может выбрать более быструю тактику с использованием предварительно отключения исключений, которые не обеспечивают трассировку стека. Чтобы полностью отключить использование предварительных исключений, используйте этот новый флаг: -xx: - Omitstacktraceinstthrow. " http://java.sun.com/j2se/1.5.0/relnotes.html

89
ответ дан 24 November 2019 в 18:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: