如何调查Xamarin / libmonosgen-2.0.so本机崩溃?

问题描述 投票:1回答:1

我的最新版本崩溃的速度约为每1000个设备99个,比之前的版本要高得多。 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)

发布前的报告显示为绿色,并且App Center没有这些崩溃,它们仅显示在Google Play中。

问题:

  1. 有人知道pid:0和tid:0是什么意思吗?这是否意味着这些崩溃是在加载应用程序代码之前发生的,还是无关紧要的?

  2. 如果不是在应用程序启动时,我能以某种方式找出崩溃发生多长时间后的情况?甚至更好,我可以将崩溃与应用程序生成的会话日志相关联吗?

  3. 是否可以配置Play或App来收集更好的痕迹?

下面的配置详细信息

Android build optionsOriginal 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对象)的访问被拒绝。显然,获取这些对象的一个​​好方法是从多个线程访问静态对象。我认为这可能意味着其中一个线程会处理底层Java对象,而不告诉Mono运行时。
  3. 第三方库,以及新的Java对象(我对正在使用的UI控件的IE更改)都是可疑的。

我已决定使用细齿梳理所有更改,还原所有软件包更新,并一步一步地进行更新,直到发行版本崩溃为止。如果我不走运,将需要几个星期,但是应该可以找出导致崩溃的原因。它还应该允许我将我的新功能交付到100%,而不会为所有用户造成崩溃峰值。手指交叉:)

android xamarin.android crash mono google-play
1个回答
0
投票

[经过大量研究(请参阅问题的底部),我决定从应用程序中删除all更改,然后开始将它们逐个再次抛出。幸运的是,就像我完成所有变更(从2个月的工作)的详细梳理一样,用户发布了1星评价,并附有详细的复制说明!。

因此,问题的答案“如何在没有堆栈跟踪的情况下调查崩溃”:

您必须找到一个复制品,(在生产版本中)找到一种方法是等待用户告诉您。

回答其他在线问题:

  1. 有人知道pid:0和tid:0是什么意思吗?这是否意味着这些在加载应用程序代码之前发生崩溃,或者那个无关的?

  2. 如果不是在应用启动时,我能以某种方式找出多长时间后崩溃发生了吗?甚至更好,我可以将崩溃与应用相关联吗生成的会话日志?

    • 我还没有找到添加到这些日志的方法,更好的方法是找到一个副本。
  3. 是否可以通过配置Play或App来更好地收集痕迹?

    • 不适用于此类崩溃。

详细信息/实际崩溃的根本原因:

事实证明,自上次更新以来,我最喜欢的PropertyChanged.Fody和Xamarin Forms的行为已发生变化,以至于生成的PropertyChanged事件比过去更多(IE,即使该值是指定的值等于原始值,则将触发“属性更改”事件。]

在我更有趣的视图模型之一中(该模型基于输入控件中的文本值进行自动单位转换),当与自定义控件结合使用时,将导致无限递归。 (意味着该值将发生变化,这将触发一个propertychanged事件,这将更新控件,该控件会将值分配给视图模型,这将触发propertychanged,等等。)

the winning review

[我一旦进行了复制,调查和解决问题就变得微不足道;通过使用[DoNotNotify]

装饰其中一个属性,我得以解决此问题

problem solved

© www.soinside.com 2019 - 2024. All rights reserved.