我的多线程服务器出了问题。它是Windows服务,其工作方式类似于管理与许多客户端的套接字连接的FTP服务器。它是使用Delphi 2006(Turbo Delphi)创建的,在大多数机器上运行良好。不幸的是,在某些机器上它有时会崩溃而没有任何痕迹(异常应该保存到日志中,但不是)。有时系统显示MessageBox(它不是来自服务的MessageBox,但我认为它是系统MessageBox),但我经常在System EventLog中看到这样的信息:
Application popup: ht_switch.exe - Application Error : The exception unknown software exception (0x0eedfade) occurred in the application at location 0x77e4bef7.
在Application EventLog中我可以看到:
Faulting application ht_switch.exe, version 1.2.0.2, faulting module kernel32.dll, version 5.2.3790.5069, fault address 0x0000bef7.
有时这些条目在应用程序或系统事件日志中,但没有任何反应 - 我的服务器通常工作,但有时只是消失。然后,Service Manager在EventlLog中报告我的服务意外停止。
我认为这种问题没有“常见”的情况。它出现在一些WinXP,Win2003和Win2008上。所有测试机都应用了所有MS补丁。
我已阅读:0x0eedfade kernelbase.dll faulting module in d7 windows service的答案,但我不使用Dialog
单位。
我可以做些什么来修复它?如何追踪这样的0x0eedfade
例外?
修改
我用EurekaLog和madExcept测试了几天我的服务器。
EurekaLog :
服务器没有问题。 EventLog中没有报告异常。在%AppData%\EurekaLab s.a.s\EurekaLog\Bug Reports\
中没有报告异常(应该有我的程序的目录,但它没有创建 - 我不知道是否应该创建它或者它是否是EurekaLog错误。)
EurekaLog7将“应用程序类型”设置为Windows服务时出现问题。这是众所周知的问题,作者正在研究它。我使用它编译的服务适用于WinXP,但无法在Win2003上运行。它根本就没有开始。
madExcept :
服务器工作了4个小时并崩溃了。我在我的帖子中发现了这个异常:
EAccessViolation: Access violation at address 7C90100B in module 'ntdll.dll'. Read of address 00000018!!!
我没有注意到有关此异常的任何madExcept报告。在此异常之后,一个线程在CLOSE_WAIT
状态(另一端关闭连接)中丢失了套接字。然后我重新启动了我的服务,在接下来的几个小时之后它没有问题。
禁用了EurekaLog和madExcept :
10-30分钟后,我看到MessageBox有错误。但是0x0eedfade
错误是神秘的,并没有向我显示任何关于问题根源的暗示。这也很奇怪,因为在显示这样的消息服务后没有问题(大部分时间)。
摘要od异常拦截器:
EurekaLog和madExcept可能擅长Delphi引发的异常,但似乎我的服务和错误的改变行为神奇地消失了,或者他们将异常报告给我找不到的地方。
编辑:问题已解决
经过一些调试导致我无处可去(Call Stack with very strange places)我从它辞职并开始检查最后提交的更改。一个变化是字符串操作,其中字符串(AnsiString)可以是64或128(某种位掩码)。我设置了早先用SetLength(buffer, 64)
分配的字符串的第70个字符。那就是问题所在。我想通过启用范围检查可以节省时间。
答案 0 :(得分:6)
如何跟踪这样的0x0eedfade异常?
这是Delphi异常的代码。很明显,你正在提出一个未被处理的Delphi异常,这会使你的进程失效。
您应该在您的流程中添加madExcept,EurekaLog,JCLDebug或类似内容。当您的流程失败时,这些工具将生成诊断报告。这些报告中最有用的部分是故障点的堆栈跟踪。然后,您应该能够找出失败发生的地方,至少,这通常足以解决您的代码出了什么问题。