【发布时间】: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]
产生此异常的原因:
我使用此库的自定义版本升级以与通用应用程序一起使用: https://github.com/brendankowitz/ZeroProximity.Accordion 。不得不提的是,该控件运行良好。
Accordion 项内部是一个控件模板,其中包含一个带有动态绑定事件 (SelectedItemChanged) 的 ListBox。随机地,当点击 ListItem 时,应用程序会引发此异常。事件背后的代码将应用程序导航到另一个页面。我需要指定事件在没有导航部分的情况下工作并且应用程序不会崩溃。
-
我还需要指定仅在设备上发生异常,在所有模拟器上应用程序都可以完美运行。另外,我是“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