在我使用Xamarin创建的Android原生应用中,我在HockeyApp中收到以下崩溃报告:
Xamarin caused by: android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
at System.Threading.Tasks.RangeWorker.FindNewWork (System.Int64& nFromInclusiveLocal, System.Int64& nToExclusiveLocal) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0
at System.Threading.Tasks.RangeWorker.FindNewWork32 (System.Int32& nFromInclusiveLocal32, System.Int32& nToExclusiveLocal32) [0x00000] in <8f1acca5a43d45c5b8d35add5a11806a>:0
at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback () <0xec919968 + 0x00033> in <8f1acca5a43d45c5b8d35add5a11806a>:0
我无法弄清楚导致此异常的原因,因为堆栈跟踪仅包含.net代码。我查看了框架的源代码,看看我是否可以理解它,但无济于事。
我也在我最喜欢的搜索引擎中尝试了很多不同的搜索,但没有发现任何类似问题的帖子/文章。
从与这些崩溃相关的数据来看,它似乎只是在三星设备(S8,S8 +和Note8)上发生的问题。我无法100%确定它不会影响其他设备,但我只有那些崩溃报告。
知道什么可能导致那些崩溃吗?我是否在使用线程做错了,可能还有取消令牌?我有没有正确处理的条件?
任何有助于进一步解决这个问题的帮助都会受到欢迎。
谢谢
编辑:
我知道没有太多要做但是因为这是我在HockeyApp中获得的唯一堆栈跟踪而我无法复制,我不知道是什么代码导致了这一点。
我正在寻找的是更多关于什么可能导致Mono线程代码在我自己不管理线程时具有空引用异常的线索。或者这个堆栈跟踪只是一个红色的鲱鱼,我需要在其他地方寻找?
引起我注意的是FindNewWork32调用 - link for the .NET implementation。您的应用程序可能会针对32位架构进行编译,而您提到的三星设备则具有64位处理器。
This Microsoft paper展示了如何将应用程序定位到一个或多个Android支持的CPU架构。您可能需要定位多个平台:
要定位多个CPU体系结构,您可以选择多个ABI(以更大的APK文件大小为代价)。您可以使用每个选定的ABI选项生成一个包(.apk)(在设置包装属性中描述)为每个支持的体系结构创建单独的APK。
您不必选择arm64-v8a或x86_64来定位64位设备;在64位硬件上运行您的应用程序不需要64位支持。例如,64位ARM设备(例如Nexus 9)可以运行为armeabi-v7a配置的应用程序。启用64位支持的主要优点是使您的应用程序可以处理更多内存。
你应该在回调后立即致电.IsCompleted
或.Wait()
。如果在Context对象可能消失之前执行此操作,并且如果您的代码正在访问那些Context对象将被任意为null(已删除)。如果你调用Task.Wait()
它会阻塞线程,然后在worker抛出它时抛出一个AggregateException。尝试使用try catch块来处理异常。
问题JavaProxyThrowable
并不总是因为调用服务而发生,可能是你的活动在某些地方无效。您应该在使用活动上下文之前检查null。
我知道这个答案并不是针对您的问题,但是当您处理异常消息时,如此简短,检查系统范围的日志记录总是一个好主意。对于Android,您可以使用dmesg
命令(它为您提供/var/log/messages
文件的内容)获取更多信息。
祝好运