Как исследовать Xamarin / libmonosgen-2.0.so native cra sh? - PullRequest
1 голос
/ 13 февраля 2020

Мой последний выпуск дает сбой со скоростью около 99 на 1000 устройств, что значительно выше, чем выпуск до него. Новые сбои в libmonosgen представлены в двух вариантах:

Кластер 1: libmonosgen-2.0.so

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR)
libmonosgen-2.0.so

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.dailybits.foodjournal <<<

backtrace:
  #00  pc 0000000000192304  /data/app/com.dailybits.foodjournal-KapbLS3Zx20G2S79yI3CTw==/lib/arm/libmonosgen-2.0.so

Кластер 2: libmonosgen-2.0.so ( mono_class_get_flags)

signal 11 (SIGSEGV), code 2 (SEGV_ACCERR)
mono_class_get_flags
*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.dailybits.foodjournal <<<

backtrace:
  #00  pc 000000000014f310  /data/app/com.dailybits.foodjournal-rwLqwfyotHI-Ulk481Wk8g==/lib/arm64/libmonosgen-2.0.so (mono_class_get_flags)

Предварительный отчет выглядит зеленым, а в Центре приложений нет ни одного из этих сбоев, они отображаются только в Google Play.

Вопросы :

  1. Кто-нибудь знает, что означают pid: 0 и tid: 0? Означает ли это, что эти сбои происходят до того, как код приложения загружен, или это не связано?

  2. Если это не при запуске приложения, могу ли я как-нибудь выяснить, через какое время sh происходит? Или, что еще лучше, можно ли сопоставить сбои с журналами сеансов, сгенерированными приложением?

  3. Есть ли способ настроить Play или приложение для сбора лучших трасс?

Подробности конфигурации ниже

Android build options Original build options, same problem (оба варианта сборки приводят к одной и той же проблеме)

Информация о версии

Microsoft Visual Studio Professional 2019
Version 16.4.2
VisualStudio.16.Release/16.4.2+29613.14
Microsoft .NET Framework
Version 4.8.03752

Xamarin   16.4.000.307 (d16-4@e031886)
Visual Studio extension to enable development for Xamarin.iOS and Xamarin.Android.

Xamarin.Android SDK   10.1.1.0 (d16-4/f2c9364)
Xamarin.Android Reference Assemblies and MSBuild support.
    Mono: bef1e63
    Java.Interop: xamarin/java.interop/d16-4@c4e569f
    ProGuard: xamarin/proguard/master@905836d
    SQLite: xamarin/sqlite/3.28.0@46204c4
    Xamarin.Android Tools: xamarin/xamarin-android-tools/master@9f4ed4b

Изменить 2/17/2020

Некоторые из моих исследований на сегодняшний день:

  1. Похоже, libmonosgen содержит сборщик мусора Xamarin.
  2. SEGV_ACCERR - доступ запрещен для объекта платформы (объект IE уже удален). Хороший способ получить это, очевидно, состоит в том, чтобы иметь доступ к c объектам из нескольких потоков. Я думаю, это может означать, что один из потоков избавляется от лежащего в основе объекта Java, не сообщая среду выполнения Mono.
  3. Сторонние библиотеки, а также новые объекты Java (IE изменения в пользовательском интерфейсе элементы управления, которые я использую) являются подозрительными.

Я решил go с тонкой зубчатой ​​расческой для всех изменений, отменить все обновления пакета и повторить их один раз. один за другим, пока релиз не начнет падать. Если мне не повезет, это займет несколько недель, но это должно сработать, чтобы выяснить, что вызывает крэ sh. Это также должно позволить мне довести мои новые функции до 100%, не вызывая резких сбоев для всех пользователей. Скрестив пальцы:)

1 Ответ

0 голосов
/ 19 февраля 2020

После большого количества исследований (см. Нижнюю часть вопроса) я решил удалить из приложения все изменения и снова начать выводить их один за другим. К счастью, точно так же, как я закончил детальную проработку всех изменений (от 2 месяцев работы), пользователь разместил 1-звездочный отзыв с подробными инструкциями по воспроизведению!.

Итак, ответ на вопрос «как расследовать сбои без трассировки стека»:

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

Ответы на другие встроенные вопросы:

  1. Кто-нибудь знает, что означают pid: 0 и tid: 0? Означает ли это, что эти сбои происходят до загрузки кода приложения, или это не связано?

  2. If это не при запуске приложения, могу ли я как-то узнать, через сколько времени происходит cra sh? Или, что еще лучше, можно ли сопоставить сбои с журналами сеансов, сгенерированными приложением?

    • Я не нашел способа добавить эти журналы, лучше найти репо.
  3. Есть ли способ настроить Play или приложение для сбора лучших следов?

    • Не для таких сбоев.

Подробности / root причина фактического кра sh:

Как оказалось, мои любимые PropertyChanged.Fody и Xamarin Forms's поведение изменилось с тех пор, как я обновлял его в последний раз, до того момента, когда было сгенерировано больше событий PropertyChanged, чем в прошлом (IE, даже если назначаемое значение равно исходному значению, событие «измененное свойство») теперь запускается).

В одной из моих наиболее интересных моделей просмотра (которая выполняет автоматическое преобразование c единиц на основе текстового значения из элемента управления вводом), и в сочетании с пользовательским элементом управления это приводит к бесконечности рекурсии. (Значение означает, что значение изменится, что приведет к событию propertychanced, которое обновит элемент управления, который назначит значение для viewmodel, что приведет к запуску propertychanged, et c ...)

the winning review

После того, как у меня появилось повторение, исследование и устранение проблемы было тривиальным; Мне удалось решить эту проблему, украсив одно из свойств с помощью [DoNotNotify]

problem solved

...