如何在Xamarin Android中排除SIGSEGV崩溃问题

3
我们刚刚在应用商店发布了新版本的Android应用程序,现在用户报告出现崩溃。我们已经能够重现,但是它在整个应用程序中随机发生,是一个SIGSEGV崩溃。

https://gist.github.com/justintoth/78abbd4b647de3ee04037631e921198f

最近发生的两次崩溃似乎都与imageview有关,这是根据回溯信息得出的结论。
崩溃 #1:

A/DEBUG(6953): #00 pc 000c1178 /system/lib/libandroid_runtime.so 04-13 17:26:53.640: A/DEBUG(6953): #01 pc 020813ce /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.RenderNode.nGetTransformMatrix+138) 04-13 17:26:53.640: A/DEBUG(6953): #02 pc 020845cd /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.RenderNode.getMatrix+89) 04-13 17:26:53.640: A/DEBUG(6953): #03 pc 020082dd /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.View.getMatrix+89) 04-13 17:26:53.640: A/DEBUG(6953):

04 pc 02061f2b /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.ViewGroup.invalidateChild+119) 04-13

17:26:53.640: A/DEBUG(6953): #05 pc 0200bda1 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.View.invalidateInternal+541) 04-13 17:26:53.640: A/DEBUG(6953): #06 pc 0200ba3b /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.View.invalidate+103) 04-13 17:26:53.640: A/DEBUG(6953):

07 pc 0200b822 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.view.View.invalidate+46) 04-13 17:26:53.640:

A/DEBUG(6953): #08 pc 0216c878 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.widget.ImageView.setImageDrawable+180)

这是一个关于Android应用程序错误的日志,描述了在应用程序中某些函数被调用时发生的错误。

崩溃 #2:

/system/lib/libskia.so (_ZN8SkMatrix13setRectToRectERK6SkRectS2_NS_10ScaleToFitE+289) 04-13 17:59:57.981: A/DEBUG(8047): #01 pc 000f7c9d /system/lib/libandroid_runtime.so (_ZN7android12SkMatrixGlue13setRectToRectEP7_JNIEnvP8_jobjectxS4_S4_i+134) 04-13 17:59:57.981: A/DEBUG(8047): #02 pc 01936e62 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.graphics.Matrix.native_setRectToRect+190) 04-13 17:59:57.981: A/DEBUG(8047): #03 pc 01939373 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.graphics.Matrix.setRectToRect+127) 04-13 17:59:57.981: A/DEBUG(8047): #04 pc 0216977d /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.widget.ImageView.configureBounds+1625) 04-13 17:59:57.981: A/DEBUG(8047): #05 pc 0216b253 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.widget.ImageView.invalidateDrawable+159) 04-13 17:59:57.981: A/DEBUG(8047): #06 pc 0170f783 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.graphics.drawable.Drawable.invalidateSelf+79) 04-13 17:59:57.981: A/DEBUG(8047): #07 pc 017100f5 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.graphics.drawable.Drawable.setVisible+81) 04-13 17:59:57.981: A/DEBUG(8047): #08 pc 0216a91f /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.widget.ImageView.updateDrawable+619) 04-13 17:59:57.981: A/DEBUG(8047): #09 pc 0216c829 /system/framework/x86/boot-framework.oat (offset 0x1588000) (android.widget.ImageView.setImageDrawable+101)

这是一个关于编程的错误信息,涉及到多个文件和函数。
我不清楚如何解决SIGSEGV崩溃问题,因为它们似乎是低级别的,并且不包含来自我的实际代码的堆栈跟踪。作为应用程序开发人员,它们通常是我可以控制的崩溃吗?还是Xamarin的错误?我最好的选择是尝试降级我的Xamarin软件包(这可能很困难,因为他们的下载页面现在仅提供了最近的两个版本...)。有没有人有经验处理这个问题?

1
报告中的崩溃是“致命信号11(SIGSEGV),代码1,故障地址0x0”(假设com.rpr.mobile是您的应用程序),因此您的应用程序正在访问已释放/取消引用的引用(对象/等),因为其地址为零(0x0)。对崩溃日志进行符号化,因为在这种情况下,您正在为ImageView分配错误的可绘制项(无论是BitMap已释放还是已GC'd或者只是不可用)。 - SushiHangover
@SushiHangover 谢谢,你说得很对。我们不手动调用SetImageDrawable,而是使用一个叫做FFImageLoading的库来处理这个问题,但是我们确实有一些代码,在我们的自定义ImageView控件从内存中释放时手动释放位图/可绘制对象。当我禁用了这个自定义代码后,SIGSEGV就消失了。不过很奇怪,这段代码以前运行得很好,只有在最新的Xamarin安装中才会抛出SIGSEGV。无论如何,请将您的评论发布为答案,我会接受的。 - Justin
1个回答

5

致命信号11(SIGSEGV),代码1,故障地址0x0

您的应用程序正在访问已释放/取消引用的引用(对象/等),因为其地址为零(0x0)。

(6953): backtrace:
~~~
(android.view.RenderNode.getMatrix+89)
(android.view.View.getMatrix+89)
(android.view.ViewGroup.invalidateChild+119)
(android.view.View.invalidateInternal+541)
(android.view.View.invalidate+103)
(android.view.View.invalidate+46)
(android.widget.ImageView.setImageDrawable+180)
~~~

在这种情况下,你正在为ImageView分配一个糟糕的可绘制对象,可能是BitMap已经被释放或已被GC清除,或者不可用。
您可以使用mono-symbolicate来向logcat的回溯/崩溃中添加符号:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接