18

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

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

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

我从哪里开始解决这个问题?

4

3 回答 3

39

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

于 2013-02-19T04:40:13.820 回答
0

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

所以,我建议对堆栈框架问题有点恼火,忽略它,然后只使用 Remy 的答案。

于 2013-02-19T05:18:46.813 回答
0

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

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 功能,因为这是有故障的应用程序,它使我的应用程序能够成功运行。确保您没有任何具有内存安全保护的类似软件。

于 2015-07-21T09:59:58.760 回答