1

我们有一个用 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 重置的来源也让我感到困惑,因为在这种情况下我们没有遇到处理请求的常用程序,而且似乎 DOR 或其他东西(应用程序、Winsock、操作系统)错误地重置了连接。

为了完整起见,因为它可能是相关的,这里是我在 Delphi On Rails 项目中报告的问题以及我向 madExcept 作者询问该问题的论坛主题:问题 #6问题 #7问题 #8论坛条目

4

1 回答 1

2

作为测试,我们从版本控制中检查了一些较旧的 DOR 源,其中没有已知的连接问题,并且它在没有显示任何上述问题的情况下工作。

所以我们决定反过来解决问题:将 DOR 特定的源代码(大约 20 个文件)回滚到上一个稳定版本,并逐段“重新更新”,直到再次出现错误。如果发生这种情况,我们可以

  1. 快速回到最新的工作版本
  2. 希望与原始 DOR 源非常接近,以便我们可以对库的更新做出反应。
  3. 分析发生的错误并向 DOR 项目报告详细的问题(甚至可能是解决方案)。

编辑:我们现在可以将除一个文件之外的所有文件更新回旧状态,而不会出现连接问题。产生问题的文件是 dorSynchronizer.pas,更准确地说,是该文件的r179导致了问题 - 线程已从 Windows API 更改为 Delphi TThread。我们将对此进行进一步调查,并可能在接下来的几天内向 DOR 项目添加一个问题。

EDIT2:事实证明,DOR 使用了已弃用的过程 TThread.Suspend 和 TThread.Resume 可能导致未定义的行为。我向 DOR 项目报告了一个问题。

于 2012-03-14T19:02:09.337 回答