我的最新版本的崩溃速度是每1000个设备约99个崩溃-大大高于之前的版本。 libmonosgen中的新崩溃有2种样式:

集群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中。

问题:
  • 有人知道pid:0和tid:0是什么意思吗?这是否意味着这些崩溃是在加载应用程序代码之前发生的,还是无关紧要的?
  • 如果这不是在应用程序启动时发生的,我能以某种方式找出崩溃发生多长时间后的情况?甚至更好,我可以将崩溃与应用程序生成的 session 日志相关联吗?
  • 是否可以配置Play或App收集更好的轨迹?

  • 下面的配置详细信息

    android - 如何调查Xamarin/libmonosgen-2.0.so native 崩溃?-LMLPHP
    android - 如何调查Xamarin/libmonosgen-2.0.so native 崩溃?-LMLPHP
    (两个构建选项似乎都导致相同的问题)

    版本信息
    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

    迄今为止我的一些调查:
  • 看起来libmonosgen包含Xamarin垃圾收集器。
  • SEGV_ACCERR是对平台对象(已放置IE对象)的拒绝访问。显然,获取这些对象的一种好方法是从多个线程访问静态对象。我认为这可能意味着其中一个线程在不告知Mono运行时的情况下布置了底层Java对象。
  • 第三方库以及新的Java对象(IE更改了我正在使用的UI控件)都是可疑的。

  • 我决定用细齿梳理所有更改,还原所有程序包更新,然后一个接一个地重新执行,直到发行版开始崩溃。
    如果我不走运,将需要几个星期,但应该可以找出导致崩溃的原因。它还应该允许我将新功能发布到100%,而不会给所有用户造成崩溃高峰。手指交叉:)

    最佳答案

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

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

    您必须找到一个副本,找到发布版本的一种方法是等待用户告诉您。

    回答其他在线问题:

  • 有人知道pid:0和tid:0是什么意思吗?这是否意味着这些
    在加载应用程序代码之前发生崩溃,或者
    那无关的?
  • 这意味着堆栈已损坏,并且进程和tid不再可用(并不意味着它在启动时)。 IE Weird Native Crash - pid: 0, tid: 0 signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)
  • 如果这不是在应用程序启动时,我能以某种方式找出多长时间后
    崩溃发生了吗?甚至更好,我可以将崩溃与应用相关联
    生成的 session 日志?
  • 我还没有找到添加到这些日志的方法,更好的方法是找到一个副本。
  • 是否可以配置Play或App以更好地收集
    痕迹?
  • 不适用于此类崩溃。


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

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

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

    android - 如何调查Xamarin/libmonosgen-2.0.so native 崩溃?-LMLPHP

    一旦进行了复制,调查和解决问题就变得微不足道了。
    我可以通过使用[DoNotNotify]装饰其中一个属性来解决此问题

    android - 如何调查Xamarin/libmonosgen-2.0.so native 崩溃?-LMLPHP

    关于android - 如何调查Xamarin/libmonosgen-2.0.so native 崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60213460/

    10-12 07:40
    查看更多