【问题标题】:Strange 0x0eedfade exception in Delphi multi thread programDelphi多线程程序中奇怪的0x0eedfade异常
【发布时间】:2013-05-12 06:01:03
【问题描述】:

我的多线程服务器有一个奇怪的问题。它是 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 补丁。

我已阅读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 引发的异常,但似乎我的服务的更改行为和错误神奇地消失了,或者它们将异常报告到我找不到的地方。

编辑:问题已解决

在一些导致我无处可去的调试之后(调用堆栈非常奇怪的地方),我从它辞职并开始检查最后提交的更改。一项更改是字符串操作,其中字符串 (AnsiString) 的长度可以为 64 或 128(某种位掩码)。我设置了早先分配给SetLength(buffer, 64) 的字符串的第70 个字符。这就是问题所在。我想我可以通过启用范围检查来节省时间。

【问题讨论】:

    标签: multithreading delphi exception service


    【解决方案1】:

    如何追踪这样的 0x0eedfade 异常?

    这是 Delphi 异常的代码。显然,您正在引发一个未被处理的 Delphi 异常,这会导致您的进程停止。

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

    【讨论】:

    • 谢谢,我从 EurekaLog 开始,但是这个工具的最新版本似乎存在不允许设置“VCL Windows 服务”项目类型的错误。但是我用“自定义设置”项目类型编译了我的服务,开始了测试,我正在观察会发生什么。
    • 就我个人而言,我是一个 madExcept 用户。我对这个工具赞不绝口。
    • 在其中一台测试机器上,没有此类工具的服务器在 10-15 分钟的测试后报告了0x0eedfade。使用 EurekaLog 没有这样的例外,也没有登录“Bug Raports”目录。不知道现在问题是否消失或 EurekaLog 更改了“修复”系统或隐藏错误的内容。现在我正在用 madExcept 对其进行测试。
    • 经过几天的测试,当我使用 EurekaLog 或 madExcept 编译我的服务时似乎没有显示问题,但我也无法找到问题的根源。我编辑的问题中有更多详细信息。
    • 在您的服务中强制使用 AV,并查看 ME 产生的输出。如果您无法找到强制执行的 AV 的错误报告,那么您将找不到真正问题的错误报告。首先证明 ME 以您理解的方式运行,并且会发现真正的错误。最后,SO 不是我们指导您完成漫长调试过程的地方。我想我回答了你问的原始问题。你现在问的是一个不同的问题。不断地编辑原始问题,提出越来越多的问题是不公平的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多