【问题标题】:First-chance exception at 0x782260ec in xxx.exe: 0xC0000005: Access violationxxx.exe 中 0x782260ec 处的第一次机会异常:0xC0000005:访问冲突
【发布时间】:2011-11-08 14:49:22
【问题描述】:

我的应用程序在一段时间后崩溃,但我找不到任何模式。我能够得到我的手崩溃转储。应用程序在 Windows Mobile 6.5 上运行。它是用 C# 编写的。它使用Imaging API、PInvoks 和大量线程。

当我使用 Visual Studio 2008 调试该转储时,在输出中显示“xxx.exe 中 0x782260ec 处的第一次机会异常:0xC0000005:访问冲突”

调用堆栈显示 2 个条目。但我无法匹配其中任何一个来从我的代码中调用。

windbg.exe表示此错误发生在“netcfagl3_5.dll”中

是否有一些特殊的技术可以分析来自 Windows Mobile 的转储文件?

【问题讨论】:

  • 从调试器运行是否掩盖了问题?如果是这样,这可能是一种竞争条件,根据您的描述,我怀疑对您的本机代码的并发调用不是为支持并发访问而设计的。

标签: c# windows-mobile compact-framework crash-dumps minidump


【解决方案1】:

0xC0000005: Access violation 表示您的其中一个 p/invokes 不正确。调用尝试写入它无权访问的内存区域(如果定义不正确,这很典型)。

您的转储也应该包含堆栈跟踪?

【讨论】:

    【解决方案2】:

    “第一次机会异常”通常是指已由用户代码处理的异常。如果您使用 Vosual Studio 和 Windows Mobile 模拟器进行调试,那么您可以关闭异常处理。转到调试 > 异常并检查 Win32 异常的“抛出”列。然后运行程序并尝试让它再次跌倒。

    当调试运行时,它将停止执行并在遇到“第一次机会异常”时中断调试器,让您查看导致该异常的原因,并查看它是否以任何方式相关。

    “netcfagl3_5.dll”库是 .NET CF 的一部分,而不是您的代码,这就是您无法匹配调试符号的原因。

    【讨论】:

    • 访问冲突不是 CLR 异常。他必须捕捉 Win32 异常。不过,我认为他在进行 CLR 调试时无法从中获得太多信息。
    • @PaulH 记录并编辑。此外,这样做的真正原因是在抛出执行时获得一些上下文。让您查看当前包含的变量/引用对于快速诊断问题至关重要。
    【解决方案3】:

    您需要下载 windbg,Visual Studio 2008 不会进行 Post Mortem .NET 调试。

    如果您的开发机器是 64 位的,请参阅“How to use Windbg to debug a dump of a 32bit .NET app running on a x64 machine

    否则,请参阅Post Mortem Debug under Windows Mobile with WinDbg。也可以搜索一下“Windows Mobile Post Mortem Debug”。

    最好(到目前为止)和最简单的方法是在调试器上运行时重现此问题。事后 .net 调试并不容易。

    -保罗赫

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-12-05
      相关资源
      最近更新 更多