Multithreading Delphi多线程程序中奇怪的0x0eedfade异常

Multithreading Delphi多线程程序中奇怪的0x0eedfade异常,multithreading,delphi,exception,service,Multithreading,Delphi,Exception,Service,我的多线程服务器有奇怪的问题。它是Windows服务,其工作原理类似于FTP服务器管理到许多客户端的套接字连接。它是使用Delphi2006(Turbo Delphi)创建的,在大多数机器上运行良好。不幸的是,在某些机器上,它有时会在没有任何自身跟踪的情况下崩溃(异常应该保存到日志中,但不会)。有时系统会显示MessageBox(它不是来自服务的MessageBox,但我认为它是系统MessageBox),但大多数情况下我会在系统事件日志中看到这样的信息: Application popup:

我的多线程服务器有奇怪的问题。它是Windows服务,其工作原理类似于FTP服务器管理到许多客户端的套接字连接。它是使用Delphi2006(Turbo Delphi)创建的,在大多数机器上运行良好。不幸的是,在某些机器上,它有时会在没有任何自身跟踪的情况下崩溃(异常应该保存到日志中,但不会)。有时系统会显示MessageBox(它不是来自服务的MessageBox,但我认为它是系统MessageBox),但大多数情况下我会在系统事件日志中看到这样的信息:

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补丁

我已经阅读了:的答案,但我不使用
对话框
单元

我能做些什么来修理它?如何跟踪此类
0x0eedfead
异常

编辑

我用EurekaLog和madExcept测试了几天我的服务器

尤里卡洛格:

服务器工作正常。事件日志中未报告任何异常。
%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!!!
我没有注意到任何关于这个例外的报道。在此异常之后,一个线程丢失,套接字处于
CLOSE\u WAIT
状态(另一侧连接已关闭)。然后我重新启动了我的服务,在接下来的几个小时里,它毫无问题地工作了

禁用EurekaLog和Madag,但以下情况除外:

10-30分钟后,我看到MessageBox出现错误。但
0x0eedfead
错误是神秘的,并没有向我显示任何关于问题根源的提示。这也是非常奇怪的,因为在显示这样的消息后,服务工作没有问题(大多数时候)

od异常拦截器摘要

EurekaLog和madExcept可能擅长于Delphi提出的异常,但似乎我的服务的更改行为和错误神奇地消失了,或者他们向我找不到的地方报告异常

编辑:问题已解决

在进行了一些调试之后(调用堆栈的位置非常奇怪),我放弃了它,开始检查最后提交的更改。一个变化是字符串操作,其中字符串(AnsiString)的长度可以是64或128(某种位掩码)。我设置了先前使用
SetLength(buffer,64)
分配的字符串的第70个字符。这就是问题所在。我想通过启用范围检查可以节省时间

如何跟踪这样的0x0eedfade异常

这是Delphi异常的代码。很明显,您正在引发一个Delphi异常,该异常没有得到处理,这将导致您的流程停止


您应该在流程中添加madExcept、EurekaLog、JCLDebug或类似内容。当您的流程失败时,这些工具将生成诊断报告。这些报告中最有用的部分是故障点的堆栈跟踪。您至少应该能够找出故障发生的位置,这通常足以找出代码的错误。

谢谢,我从EurekaLog开始,但该工具的最新版本似乎存在不允许设置“VCL Windows服务”项目类型的错误。但我用“自定义设置”项目类型编译了我的服务,启动了测试,我正在观察将会发生什么。就我个人而言,我是一个疯狂的用户。我对该工具赞不绝口。在一台测试机器上,我的服务器在10-15分钟的测试后报告了
0x0eedfead
。有了EurekaLog,就不会有这样的异常,也不会登录到“Bug Raports”目录。不知道现在问题是否消失了,或者EurekaLog是否改变了“修复”系统或隐藏错误的内容。现在我正在用madExcept进行测试。经过几天的测试,当我用EurekaLog或madExcept编译我的服务时,问题似乎没有显示出来,但我也无法找到问题的根源。在我编辑的问题中有更多细节。在你的服务中强制使用AV,并查看ME生成的输出。如果你找不到你强迫的AV的错误报告,那么你就找不到真正问题的错误报告。首先,证明我的工作方式是你能理解的,这会抓住真正的错误。最后,我们不是在这里指导您完成漫长的调试过程。我想我回答了你最初提出的问题。你现在问的是另一个问题。继续编辑原始问题,问得越来越多,这是不公平的。