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

标签 android xamarin.android crash mono google-play

我的最新版本以每 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 中。

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

  • 配置详情如下

    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
    

    2020 年 2 月 17 日编辑

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

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

    最佳答案

    经过大量的研究(见问题底部),我决定从应用程序中删除所有更改,并开始将它们一一发布。幸运的是,正如我完成对所有更改的详细梳理(来自 2 个月的工作),一位用户发布了 1 星评论,并附有详细的复制说明!。

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

    你必须找到一个repro,一种方法(对于生产版本)找到一个是等待你的用户告诉你。

    其他在线问题的答案:

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


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

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

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

    the winning review

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

    problem solved

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

    相关文章:

    java - Apple 芯片上使用 jdk 17.0.1 的 java 应用程序运行时崩溃

    android - 亚行不断崩溃

    java - ListView 中的复选框 onclick() 错误

    android - Xamarin.Android 致命运行时异常 getImeiForSlot

    android - 扩展 LinearLayout 空引用

    c# - 开箱即用的 Monodroid 在 Android 中是否有任何安全存储?

    c# - 使用LINQ创建搜索栏不断崩溃

    android - 检测Android主屏幕的旋转

    android - 使用 Kotlin : ClassNotFoundException 创建 AAR

    android - 将 ItemizedOverlay 添加到我的 map View