当我的程序在地址 0 处出现异常 0xc0000005 崩溃时我该怎么办?

Posted

技术标签:

【中文标题】当我的程序在地址 0 处出现异常 0xc0000005 崩溃时我该怎么办?【英文标题】:What do I do when my program crashes with exception 0xc0000005 at address 0? 【发布时间】:2013-02-03 16:28:38 【问题描述】:

我的 Delphi 程序作为 NT 服务运行,并且已经运行了 2 个多月,然后它突然停止并生成故障转储:

故障应用程序名称:tca_shctisvc_ip.exe,版本:7.1.0.1843,时间戳:0x2a425e19 故障模块名称:未知,版本:0.0.0.0,时间戳:0x00000000 异常代码:0xc0000005 故障偏移量:0x00000000

根据 Windows 事件日志中的信息,没有可用的真实地址。我能够将迷你转储加载到 WinDbg 中,它说有一个异常,但发现堆栈帧有问题。另一个工具 (Viewminidump) 能够向我显示正在运行的线程堆栈。

我从哪里着手解决这个问题?

【问题讨论】:

【参考方案1】:

异常代码0xc0000005 是访问冲突。错误偏移 0x00000000 的 AV 意味着您的服务代码中的某些内容正在访问 nil 指针。您只需在服务运行时对其进行调试,以了解它正在访问的内容。如果您无法在调试器中运行它,那么至少安装一个第三方异常记录器框架,例如 EurekaLog 或 MadExcept,以了解您的服务在 AV 发生时正在做什么。

【讨论】:

+1 用于建议异常记录器。这是除了调试器本身之外我发现的 #1 最有用的调试工具。 @Remy 你知道其他不特定于 Delphi 和 C++BUilder 的 Windows 异常记录器吗?您知道使用 C++ 构建的通用 Windows 应用程序吗?【参考方案2】:

堆栈帧的问题可能表明堆栈损坏(真正可怕的野兽)、优化或混合框架,例如 C/C++/C#/Delphi 和其他疯狂 - 关于堆栈帧没有绝对标准。 (有些语言甚至没有!)。

所以,我建议对堆栈框架问题稍稍生气,忽略它,然后只使用 Remy 的答案。

【讨论】:

【参考方案3】:

我在使用不同的应用程序时遇到了同样的问题,

Faulting application name: javaw.exe, version: 8.0.51.16, time stamp: 0x55763d32
Faulting module name: mscorwks.dll, version: 2.0.50727.5485, time stamp: 0x53a11d6c
Exception code: 0xc0000005
Fault offset: 0x0000000000501090
Faulting process id: 0x2960
Faulting application start time: 0x01d0c39a93c695f2
Faulting application path: C:\Program Files\Java\jre1.8.0_51\bin\javaw.exe
Faulting module path:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll

我使用的是 Microsoft 的增强缓解体验工具包 (EMET),我发现在我的案例中禁用 javaw.exe 上的 EMET 功能,因为这是有故障的应用程序,它使我的应用程序能够成功运行。确保您没有任何类似的内存安全保护软件。

【讨论】:

看起来 Oracle 使用 Delphi 来构建他们的 Java SE 8 JRE ;)

以上是关于当我的程序在地址 0 处出现异常 0xc0000005 崩溃时我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

winsock 选择函数中的堆栈溢出异常 (0xC00000FD)

电脑出现0xc00000ba程序失败怎么弄

开机时老出现初始化(0xc00000ba)失败

为啥电脑会运行0xc00000ba程序失败

在发布时部署 UWP:错误 0xC0000139:未找到入口点

重做系统出现0xc00000ba怎么解决?