【问题标题】:Universal App Unhandled exception (KERNELBASE.DLL)通用应用程序未处理异常 (KERNELBASE.DLL)
【发布时间】:2014-11-19 19:08:25
【问题描述】:

晚上好,

我正在开发一个通用应用程序。在几次随机崩溃和调试本机代码后,我发现本机异常是:“AssemblyName.UniversalApp.WindowsPhone.exe 中 0x777E35D7 (KERNELBASE.DLL) 处的未处理异常:0xC0000002:未实现请求的操作。”

下面是反汇编中的异常。条目 777E35D7 丢失,这是应用程序崩溃的地方。

RaiseException:
777E35A0  push        {r11,lr}  
777E35A4  mov         r11,sp  
777E35A6  bl          __security_push_cookie (777CC868h)  
777E35AA  sub         sp,sp,#0x54  
777E35AC  and         r1,r1,#1  
777E35B0  str         r1,[sp,#4]  
777E35B2  movs        r1,#0  
777E35B4  str         r1,[sp,#8]  
777E35B6  ldr         r1,RaiseException+50h (777E35F0h)  
777E35B8  str         r0,[sp]  
777E35BA  str         r1,[sp,#0xC]  
777E35BC  cbz         r3,RaiseException+40h (777E35E0h)  
777E35BE  cmp         r2,#0xF  
777E35C0  bhi         RaiseException+46h (777E35E6h)  
777E35C2  str         r2,[sp,#0x10]  
777E35C4  lsls        r2,r2,#2  
777E35C6  add         r0,sp,#0x14  
777E35C8  mov         r1,r3  
777E35CA  bl          memcpy (7781ECC4h)  
777E35CE  ldr         r3,RaiseException+4Ch (777E35ECh)  
777E35D0  mov         r0,sp  
777E35D2  ldr         r3,[r3]  
777E35D4  blx         r3  
777E35D6  add         sp,sp,#0x54  
777E35D8  bl          __security_pop_cookie (777CC880h)  
777E35DC  pop         {r11,pc}  
777E35E0  movs        r3,#0  
777E35E2  str         r3,[sp,#0x10]  
777E35E4  b           RaiseException+2Eh (777E35CEh)  
777E35E6  movs        r2,#0xF  
777E35E8  b           RaiseException+22h (777E35C2h)  
777E35EA  __debugbreak  
777E35EC  ?? ?? 
777E35EE  strb        r6,[r0,#0x1E]  
777E35F0  adds        r5,r5,#0xA1  
777E35F2  strb        r6,[r7,#0x1D]  

产生此异常的原因:

  1. 我使用此库的自定义版本升级以与通用应用程序一起使用: https://github.com/brendankowitz/ZeroProximity.Accordion 。不得不提的是,该控件运行良好。

  2. Accordion 项内部是一个控件模板,其中包含一个带有动态绑定事件 (SelectedItemChanged) 的 ListBox。随机地,当点击 ListItem 时,应用程序会引发此异常。事件背后的代码将应用程序导航到另一个页面。我需要指定事件在没有导航部分的情况下工作并且应用程序不会崩溃。

  3. 我还需要指定仅在设备上发生异常,在所有模拟器上应用程序都可以完美运行。另外,我是“Developer Preview”计划的成员,所以我的 Windows Phone 版本 (8.10.14203.306) 可能会影响应用程序(不幸的是,目前我没有任何其他设备可以测试)。

我的问题是:有没有办法处理这个异常,或者找出究竟是什么没有实现?

感谢您的回答!

问候, 艾诺特

【问题讨论】:

  • 那么库不会抛出任何 NotImplementedException。在 Visual Studio 中,如果您对 NotImplementedException 执行快速 CTRL+SHIFT+F 真的没有结果吗?
  • @Pierre-LucPineault 不,图书馆很干净。此外,它不是托管异常(该库是源代码的一部分)。如果它是托管的,我会在“UnhandledException”或“UnobservedTaskException”事件中捕获异常。我必须在非托管代码 (KERNELBASE.DLL) 中捕获异常;
  • 所以,澄清一下:在选择更改事件处理程序中,您正在导航到另一个页面,这就是导致问题的原因?如果是这种情况,您可以尝试将页面导航排队到调度程序吗? (也就是说,调用它就像在 UI 线程中没有调用事件处理程序一样。)
  • @yasen 谢谢你的建议!我不敢相信我没有想到 UI 线程问题。在 Windows Phone 8 中,我总是使用 Dispatcher 在 UI 线程上执行代码。所以它现在可以工作了! 8.1 Dispatcher(用于导航)的代码是 await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { if ((!Window.Current.Content as Frame).Navigate(typeof(ItemPage))) { throw new Exception("NavigationFailedExceptionMessage"); } });。再次感谢您,@yasen!
  • 很高兴它解决了您的问题! :) 我建议这样做是因为我只在与 UI 线程访问相关的错误中遇到了 KERNELBASE.DLL。奇怪的是,在所有这些情况下,代码无论如何都应该在 UI 线程上运行,并且应该没有错误。似乎是 WP8.1 中的一个错误。 编辑:如果你有时间,如果你发布这个问题的答案会很好。

标签: c# exception windows-phone-8.1 windows-8.1 win-universal-app


【解决方案1】:

正如 Yasen 在我上一篇文章的 cmets 中所建议的那样,Windows Phone 8.1 中的导航代码应该(默认情况下)在 UI 线程上运行。

不幸的是(我仍在试图找出原因)ListBoxItem 事件处理程序中的导航代码并非一直在 UI 线程下运行,因此随机抛出了“本机代码”异常。很奇怪,抛出的异常并没有提供有关 UI 线程的任何信息(就像我们在 Windows Phone 8.0 Silverlight 上收到的一样),但 Yasen 指出 KERNELBASE.DLL 错误与 UI 线程访问异常密切相关(很高兴知道未来参考)。

解决方案是使用 Windows 运行时调度程序。您可以在下面找到有效的最终导航代码。

await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    if ((!Window.Current.Content as Frame).Navigate(typeof(ItemPage)))
                    {
                        throw new Exception("NavigationFailedExceptionMessage");
                    }
                });

再次感谢您,亚森!您刚刚节省了大量的调试时间!

问候, 伊诺特

【讨论】:

  • 天哪,谢谢。我在导航之前有这个 0xC0000002,但只发生在 Windows Phone 8.1 Preview for Developers 中,所以我花了很多天来找到解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2016-02-06
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
相关资源
最近更新 更多