繁体   English   中英

在Xamarin上调试Java.Lang.RuntimeException

[英]Debugging Java.Lang.RuntimeException on Xamarin

自2月下旬以来,由于这个java.exception,我发布的游戏不断崩溃。 大约10分钟后(根据我的经验,它确实可以通过1分钟到30分甚至60分钟或从未发生过)来解决游戏崩溃问题。 在连续2个小时的游戏玩法之后,我无法使用调试器重现崩溃。

我正在使用Hockeyapp报告应用程序崩溃但堆栈跟踪绝对是空的:

Package: hb.doom_and_destiny_advanced
Version: 1516
Android: 5.1.1
Manufacturer: HUAWEI
Model: HUAWEI SCL-L01
Date: 24/06/2016 22:25:51

Java.Lang.RuntimeException: Only the original thread that created a view hierarchy can touch its views.

似乎没有重大失败的原因,如果没有使用Monogame框架,游戏就不会使用UI系统。 经过几个月的测试,我真的忍不住要求一些帮助来调试这个错误,这让我很生气。

目前主要问题是无法在一致且可行的测试时间内重现崩溃:它可能在1分钟内或超过60分钟内出现,并且它似乎在某种程度上受用户交互影响(我从来没有过能够在运行基准测试时看到错误)。

检查android日志也无济于事,因为它们包含来自许多android系统的极其混乱的信息,但是,就mono来说,它根本不是冗长的。

06-20 19:04:16.917: W/ls(27999): type=1400 audit(0.0:3522): avc: denied { getattr } for path="/init" dev="rootfs" ino=5443 scontext=u:r:shell:s0 tcontext=u:object_r:init_exec:s0 tclass=file permissive=0
06-20 19:04:16.917: W/ls(27999): type=1400 audit(0.0:3523): avc: denied { getattr } for path="/persist" dev="mmcblk0p16" ino=2 scontext=u:r:shell:s0 tcontext=u:object_r:persist_file:s0 tclass=dir permissive=0
06-20 19:04:18.068: D/ConnectivityService(772): notifyType CAP_CHANGED for NetworkAgentInfo [WIFI () - 101]
06-20 19:04:19.215: W/SoundPool(12501):   sample 1 not READY
06-20 19:04:19.254: I/OMXClient(12501): Using client-side OMX mux.
06-20 19:04:19.258: E/OMXMaster(12501): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.
06-20 19:04:19.418: W/AudioTrack(12501): AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz
06-20 19:04:19.419: D/audio_hw_primary(198): out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2
06-20 19:04:19.430: D/audio_hw_primary(198): select_devices: out_snd_device(2: speaker) in_snd_device(0: none)
06-20 19:04:19.430: D/msm8974_platform(198): platform_send_audio_calibration: sending audio calibration for snd_device(2) acdb_id(15)
06-20 19:04:19.430: D/audio_hw_primary(198): enable_audio_route: apply and update mixer path: low-latency-playback
06-20 19:04:19.608: I/art(12501): Starting a blocking GC Explicit
06-20 19:04:19.624: I/art(12501): Explicit concurrent mark sweep GC freed 3391(130KB) AllocSpace objects, 3(604KB) LOS objects, 25% free, 46MB/62MB, paused 265us total 15.711ms
06-20 19:04:21.082: D/ConnectivityService(772): notifyType CAP_CHANGED for NetworkAgentInfo [WIFI () - 101]
06-20 19:04:21.941: D/audio_hw_primary(198): out_set_parameters: enter: usecase(0: deep-buffer-playback) kvpairs: routing=2
06-20 19:04:21.927: W/ls(28029): type=1400 audit(0.0:3524): avc: denied { getattr } for path="/init" dev="rootfs" ino=5443 scontext=u:r:shell:s0 tcontext=u:object_r:init_exec:s0 tclass=file permissive=0
06-20 19:04:21.927: W/ls(28029): type=1400 audit(0.0:3525): avc: denied { getattr } for path="/persist" dev="mmcblk0p16" ino=2 scontext=u:r:shell:s0 tcontext=u:object_r:persist_file:s0 tclass=dir permissive=0
06-20 19:04:22.278: W/SoundPool(12501):   sample 2 not READY
06-20 19:04:22.292: I/OMXClient(12501): Using client-side OMX mux.
06-20 19:04:22.296: E/OMXMaster(12501): A component of name 'OMX.qcom.audio.decoder.aac' already exists, ignoring this one.
06-20 19:04:22.479: W/AudioTrack(12501): AUDIO_OUTPUT_FLAG_FAST denied by client; transfer 4, track 44100 Hz, output 48000 Hz
06-20 19:04:22.490: D/audio_hw_primary(198): out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2
06-20 19:04:22.527: D/AudioFlinger(198): mixer(0xb41c0000) throttle end: throttle time(4)
06-20 19:04:22.941: D/audio_hw_primary(198): out_set_parameters: enter: usecase(0: deep-buffer-playback) kvpairs: routing=2
06-20 19:04:25.784: D/audio_hw_primary(198): disable_audio_route: reset and update mixer path: low-latency-playback
06-20 19:04:26.927: W/ls(28070): type=1400 audit(0.0:3526): avc: denied { getattr } for path="/init" dev="rootfs" ino=5443 scontext=u:r:shell:s0 tcontext=u:object_r:init_exec:s0 tclass=file permissive=0
06-20 19:04:26.927: W/ls(28070): type=1400 audit(0.0:3527): avc: denied { getattr } for path="/persist" dev="mmcblk0p16" ino=2 scontext=u:r:shell:s0 tcontext=u:object_r:persist_file:s0 tclass=dir permissive=0
06-20 19:04:27.114: D/ConnectivityService(772): notifyType CAP_CHANGED for NetworkAgentInfo [WIFI () - 101]
06-20 19:04:28.947: I/art(12501): Starting a blocking GC Explicit
06-20 19:04:28.960: I/art(12501): Explicit concurrent mark sweep GC freed 2256(88KB) AllocSpace objects, 0(0B) LOS objects, 25% free, 46MB/62MB, paused 285us total 12.462ms
06-20 19:04:28.984: I/mono-stdout(12501): Writing unhandled exception to: /data/user/0/hb.doom_and_destiny_advanced/files/77b60833-c767-4692-9068-4b829619d394.stacktrace

游戏确实密集使用网络电话,所以我想,如果连接不一致,也许android正试图显示弹出窗口。 由于可以从辅助任务/线程中调用弹出窗口,因为Xamarin在单声道实现中缺少“RunOnUiThread”,因此可能会崩溃。

如果是这种情况我可以通过发布旧版本的Xamarin Android来检查它,但Gen 2016版本不再可供下载。

在将Exception日志记录软件更新到最新版本后,错误日志似乎提供了更多信息,我仍然不知道哪个线程崩溃,但我肯定会在搜索中获得更多点击。

Xamarin引起的:android.runtime.JavaProxyThrowable:System.AggregateException:通过等待任务或访问其Exception属性,未观察到任务的异常。 结果,终结器线程重新抛出了未观察到的异常。 ---> Java.Lang.RuntimeException:只有创建视图层次结构的原始线程才能触及其视图。 ---内部异常堆栈跟踪结束--- --->(内部异常#0)Java.Lang.RuntimeException:只有创建视图层次结构的原始线程才能触及其视图。<---

at dalvik.system.NativeStart.run(Native Method)

似乎有2个问题的组合:

1)任务崩溃,可能是因为

(Inner Exception #0) Java.Lang.RuntimeException: Only the original thread that created a view hierarchy can touch its views.<---

2)一旦gc收集任务,异常就会被重新抛出并用外部杀死应用程序

System.AggregateException: A Task's exception(s) were not observed either by Waiting on the Task or accessing its Exception property.

因此,正如我在最新发现中提出的那样,崩溃是由于任务抛出异常,并等待垃圾收集器完成重新抛出异常。

这很难调试,因为我没有得到完整的Exception层次结构,因为我在崩溃报告软件中使用了一个修改过的异常处理程序,它只提取了最新的“InnerException”。

实际的异常是我试图从一个不是视图创建线程的线程禁用自动屏幕调光。

看到这两个步骤并添加到我的代码库中

  1. 从所有活动的创建或调用此方法HandleGlobalExceptions()
  2. 创建基本活动并覆盖基本活动的oncreate,并调用此方法示例代码以添加

    使用ar = Android.Runtime;

      public static void HandleGlobalExceptions() { AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += HanldleDomainGlobalException; ar.AndroidEnvironment.UnhandledExceptionRaiser += HandleAndroidEnvException; } 

    这两个助手被称为

      private static void HandleAndroidEnvException(object sender, ar.RaiseThrowableEventArgs e) { Log.Wtf("EnvGlobal", e.Exception.ToString()); // display or handle error here , the way uwant } private static void HanldleDomainGlobalException(object sender, UnhandledExceptionEventArgs e) { Log.Wtf("DomainGlobal", e?.ExceptionObject?.ToString()); // display or handle error here , the way uwant } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM