我的Delphi程序作为NT服务运行,运行正常超过2个月,然后突然停止并产生故障转储:
错误应用程序名称:tca_shctisvc_ip.exe,版本:7.1.0.1843,时间戳:0x2a425e19错误模块名称:未知,版本:0.0.0.0,时间戳:0x00000000异常代码:0xc0000005错误偏移量:0x00000000
根据Windows事件日志中的信息,没有真正的地址可供使用。我能够将迷你转储加载到WinDbg中,它说有一个例外,但发现了堆栈帧的问题。一个不同的工具(Viewminidump)能够显示正在运行的线程的堆栈。
我从哪里开始解决此问题?
答案 0 :(得分:28)
异常代码0xc0000005
是访问冲突。故障偏移0x00000000
处的AV意味着服务代码中的某些内容正在访问nil
指针。您只需在服务运行时调试该服务以找出它正在访问的内容。如果您无法在调试器中运行它,那么至少要安装第三方异常记录器框架(例如EurekaLog或MadExcept),以了解您的服务在AV时正在执行的操作。
答案 1 :(得分:0)
堆栈帧的问题可能表明堆栈损坏(真正可怕的野兽),优化或混合框架,如C / C ++ / C#/ Delphi和其他疯狂 - 堆栈帧没有绝对的标准。 (有些语言甚至没有它们!)。
所以,我建议稍微讨厌堆栈框架问题,忽略它,然后只使用Remy的答案。
答案 2 :(得分: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功能,因为这是错误的应用程序,它使我的应用程序能够成功运行。确保您没有任何类似的内存安全保护软件。