我的多线程服务器有一个奇怪的问题。它是 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.
在应用程序事件日志中,我可以看到:
Faulting application ht_switch.exe, version 1.2.0.2, faulting module kernel32.dll, version 5.2.3790.5069, fault address 0x0000bef7.
有时这样的条目在应用程序或系统事件日志中,但没有任何反应——我的服务器正常工作,但有时只是消失了。然后服务管理器在 EventlLog 中报告我的服务意外停止。
我看不到此类问题的“常见”情况。它出现在某些 WinXP、Win2003 和 Win2008 上。所有测试机器都应用了所有 MS 补丁。
我已阅读以下答案:d7 windows 服务中的 0x0eedfade kernelbase.dll 故障模块,但我不使用Dialog
单元。
我能做些什么来修复它?如何追踪此类0x0eedfade
异常?
编辑
我用 EurekaLog 和 madExcept 测试了我的服务器几天。
尤里卡日志:
服务器工作没有问题。EventLog 中没有报告异常。没有报告异常%AppData%\EurekaLab s.a.s\EurekaLog\Bug Reports\
(我的程序应该有目录,但它没有创建——我不知道是否应该创建它或者它是否是一个 EurekaLog 错误)。
EurekaLog7 将“应用程序类型”设置为 Windows 服务有问题。这是已知问题,作者正在研究它。我用它编译的服务可以在 WinXP 上运行,但不能在 Win2003 上运行。它根本不启动。
疯狂除外:
服务器工作了 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 引发的异常,但似乎我的服务的更改行为和错误神奇地消失了,或者它们将异常报告到我找不到的地方。
编辑:问题已解决
经过一些导致我无处可去的调试(调用堆栈非常奇怪的地方)后,我退出了它并开始检查最后提交的更改。一项更改是字符串操作,其中字符串 (AnsiString) 的长度可以为 64 或 128(某种位掩码)。我设置了之前分配的字符串的第 70 个字符SetLength(buffer, 64)
。这就是问题所在。我想我会通过启用范围检查来节省时间。