Как отследить «невозможных» NPE в магазине Play Vitals? - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть приложение, которое уже много лет установлено за многие годы, и кажется, что всегда будут NPE, независимо от того, что я делаю.

Корнем всех этих NPE является объект переменной-члена, который внезапно перестал существовать. Не один, а вообще какой-то предмет, на который держится сильная ссылка, внезапно исчез. Я понятия не имею, в каком состоянии было приложение, или оно вызвано каким-то "app killer" приложением или GC или ...

Я вижу некоторые из этих записей NPE в магазине игр "vitals", а некоторые даже находятся в системных файлах Android, к которым у меня нет доступа. Я НЕ новичок и хорошо понимаю Java / Android, поэтому это меня так озадачивает. В каждой версии я добавляю все больше и больше защитных функций, и это становится излишним, но каждый раз, когда я проверяю жизненно важные органы, я вижу NPE «новый в версии x» старого файла, который не был изменен, и это объект, который ДОЛЖЕН быть там.

Есть ли способ отследить истинную причину удаления? или как вообще относятся к этим исключениям?!

Edit:

Мы не говорим об ОДНОМ отдельном NPE, мы говорим о НЕСКОЛЬКИХ, каждое из которых происходит с частотой менее 0,1% (в зависимости от магазина игр) во всем приложении, которое состоит из 20+ Активностей, и все это работает гладко на всех испытательные устройства на протяжении многих лет.

Я предполагаю, что это происходит в различных крайних случаях, например, когда приложение находится в фоновом режиме в течение нескольких недель или находится в фоновом режиме при нехватке памяти и т. Д., Но оно не сообщает мне, когда это произошло (в записи магазина воспроизведения)

1 Ответ

0 голосов
/ 29 апреля 2019

Как правило, такая проблема возникает из-за ошибки в потоке.Два или более потоков совместно используют изменяемые объекты или переменные без адекватной синхронизации.Это может привести к состязанию или более коварным проблемам, вызванным тем, что потоки видят устаревшие значения при чтении памяти.(Читайте о модели памяти Java.)

К сожалению, нет волшебного решения этой проблемы:

  • Я не знаю ни одного хорошего (бесплатного) инструментадля анализа кодовой базы для потоковых ошибок.

  • Найти их с помощью трассировки или отладчика сложно, потому что a) эти ошибки, как правило, сложно воспроизвести, и b) эти методы имеют тенденцию изменять поведение вашей программы.

  • Лучше всего попросить эксперта взглянуть на ваш код для вас.

  • Или сами станьте экспертом: начните с чтения Гетца и др. "Параллелизм Java на практике".

  • Или станьте реальным эксперт: ознакомьтесь с JLS Глава 17 ... особенно 17.4.

Лучший способ избежать подобных проблем:

  • получить полное представление о потоках Java и синхронизации,
  • получить полное представление о требованиях безопасности потоков используемой платформы / платформы (например, среды приложения Android),
  • избегать написания своихсобственный код параллелизма: предпочитайте классы более высокого уровня, предоставляемые java.util.concurrency.* и
  • расширенным автоматическим тестированием.
...