【发布时间】:2012-03-17 02:17:52
【问题描述】:
我们有一个用 Delphi 编写的应用程序,它使用 Delphi On Rails 并充当服务器并使用 HTTP、JSON 和 websockets 与客户端通信。我们最近遇到了一些问题,很难调试它们并找到问题的根源。
使用 Wireshark 进行流量分析,我们可以看到以下行为: 有来自客户端的请求(对文件的 HTTP GET)。通常,我们处理该请求并发送 HTTP 状态代码、文件(如果未缓存)等。但是,我们有一个可重现的问题,即只有 来自客户端的请求,来自服务器的 TCP SYN,但之后,服务器发送一个 RST 数据包,TCP 通信停止。
奇怪的是,我们可以很好地重现问题(尽管 RST 数据包中断通信的文件不同)并且在以下情况之一中它神秘地消失了:
- 在调试环境(Delphi IDE)中,禁用madExcept
- 在发布环境中,不使用 madExceptPatch 修补可执行文件
- 将焦点放在与主应用程序窗口不同的窗口上。
由于我们在使用 Delphi On Rails 时遇到了一些问题,并且不得不对其进行小幅修改以避免访问冲突和调试异常,我怀疑 DOR 是罪魁祸首,一些奇怪的内存损坏或未捕获的异常是错误,但它是仍然令人困惑,尤其是如果我们改变焦点,问题就会消失。
我的主要问题不是如何解决这个问题,而是如何调试它以及在哪里寻找问题。 TCP 重置的来源也让我感到困惑,因为在这种情况下我们没有遇到the usual procedures that process requests,而且似乎 DOR 或其他东西(应用程序、Winsock、操作系统)错误地重置了连接。
为了完整起见,可能是相关的,以下是我在 Delphi On Rails 项目中报告的问题以及我向 madExcept 作者询问该问题的论坛帖子:Issue #6、Issue #7、Issue #8、 forum entry.
【问题讨论】:
-
不确定这是否会有所帮助,但 Windows 会将连接重置为侦听套接字,这些套接字有大量未经过
accept()'ed 的尝试连接。其中“大量积压”的定义不是特别明确,但应该是一个合理的数字。 -
这可能是系统问题,特别是当您谈论“更改焦点”时,因此也许尝试询问服务器故障?
标签: delphi debugging tcp madexcept