【问题标题】:Why do I get these unmanaged errors in managed code?为什么在托管代码中会出现这些非托管错误?
【发布时间】:2016-04-08 10:47:39
【问题描述】:

我有一个 Windows 应用商店应用程序,我可以在 Windows 开发人员仪表板上看到用户遇到崩溃。我不理解这些报告(主要是堆栈跟踪),因为我不熟悉未管理的代码(这些应用程序在发布时被编译为 C++ 应用程序等本机代码)。然而,我确实理解(或者可能错误地认为)最常发生的错误是没有意义的错误。该应用是没有不安全代码的 XAML/C# 应用。主要的例外是:

INVALID_POINTER_READ_c0000005_W​​indows.UI.Xaml.dll!DirectUI::UIAffinityReleaseQueue::DoCleanup

INVALID_POINTER_READ_CONTEXT_MISMATCH_c0000005_W​​indows.UI.Xaml.dll!DirectUI::UIAffinityReleaseQueue::DoCleanup

谁能向我解释一下这种类型的错误如何在纯托管代码应用程序中发生?

【问题讨论】:

  • 你在终结器中有代码吗? (看起来像~YourClassName(){ ... } 的函数)另外,请在您的问题中包含完整的错误,包括堆栈跟踪。
  • 只有给定的信息,除了推测,我们无能为力。我推测,您在拆除 UI 时附加了事件处理程序。
  • @IInspectable 谢谢。这可能会发生(事件处理程序在其 UI 被拆除时触发)但所有这些事件都已包含在 try-catch 块中。此外,即使它们不是 - C# 也不应该允许指针无效。这些错误应该类似于“您正在访问已处置的对象”。对吗?
  • @ScottChamberlain 不幸的是,我无法发布堆栈跟踪。关于终结器 - 没有编写任何终结器,并且应用程序中没有第 3 方代码。所以只有那些是 Windows 运行时的一部分。
  • 如您所述,您正在编译为本机代码。一旦部署,那里不再有 .NET。即使存在,在 C# 中取消引用 NULL 指针仍然会导致 SEH 异常(本机操作系统异常),该异常会通过本机异常过滤器,在 CLR 中实现以对 .NET 异常进行建模。没有看到堆栈跟踪,很难判断这是否会导致崩溃,或者只是设置阶段。如果您无法发布堆栈跟踪,我建议将此问题作为题外话结束。

标签: c# c++ xaml windows-store-apps win-universal-app


【解决方案1】:

根据评论 - 这是基于错误的假设。

当应用程序被编译为本机代码时 - 它出现本机类型错误。

【讨论】:

  • 我希望反对者留下评论,说明原因。无论如何,这个答案有点偏离目标。无论您是在部署应用程序之前将其编译为本机代码,还是让 CLR 将其编译为目标设备上的本机代码,都没有关系。无论哪种方式,应用程序都在执行本机代码。由于 .NET 框架中的异常使用本机 SEH 基础架构,因此当应用程序因未捕获的异常而崩溃时,您将在调用堆栈上看到本机异常代码。
  • @IInspectable 可能会发生本机异常,但作为 .net 开发人员,我看不到它们。当应用程序使用 CLR 崩溃时 - CurrentDomain_UnhandledException 事件处理程序向我显示一个 ExceptionObject 可以转换为 .net Exception。所以我不必处理本机异常。我不反对。只是向像我这样习惯于专门处理 .net 的人解释什么是重要的。不过,感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多