2012-03-13 494 views
1

我们有一个用Delphi编写的应用程序,它使用Delphi On Rails作为服务器并使用HTTP,JSON和websockets与客户端通信。最近我们遇到了一些问题,很难调试它们并发现问题的根源。在某些HTTP请求上发生奇怪的TCP重置(RST)

使用Wireshark进行流量分析,我们可以看到以下行为:客户端有一个请求(文件的HTTP GET)。通常,我们处理该请求并发送HTTP状态代码,文件(如果没有缓存)等。但是,我们有一个可重现的问题,其中只有来自客户端的请求(来自服务器的TCP SYN),但在此之后,服务器发送RST数据包并停止TCP通信。

但奇怪的是,我们可以重现该问题相当不错(虽然在RST包破坏了通信的文件不同),并且在有下列情形之一神秘地消失了:

  • 在调试环境(德尔福IDE),禁用madExcept
  • 在发布的环境中,
  • 把焦点不打补丁的可执行文件madExceptPatch到不同的窗口比主应用程序窗口。

,因为我们有一些问题,德尔福on Rails和不得不做小的修改,以避免访问冲突和调试例外,我怀疑DOR是罪魁祸首和一些奇怪的内存损坏或uncatched例外是错误,但仍然令人困惑,特别是如果我们改变焦点,问题就会消失。

我的主要问题不是如何解决这个问题,而是如何调试它以及在哪里寻找问题。 TCP重置的来源也令我感到困惑,因为在那种情况下我们没有遇到the usual procedures that process requests,并且它好像是DOR或其他东西(应用程序,Winsock,OS)错误地重置了连接。

为了完整,因为它可能是相关的,这里是我在德尔福on Rails项目和一个论坛主题,我问madExcept笔者有关该问题的报告的问题:Issue #6Issue #7Issue #8forum entry

+0

不知道这是否会有所帮助,但Windows会重置连接到侦听套接字,这些套接字有大量未尝试的连接,它们不是'accept()'ed。 “大量积压”没有特别明确的定义,但应该是一个合理的数字。 – cha0site 2012-03-13 20:45:18

+0

这可能是一个系统问题,特别是当你在谈论“改变焦点”,因此也许尝试询问serverfault? – pmod 2012-03-13 20:59:54

回答

1

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

所以我们决定反过来想解决的问题:回滚DOR特定的源代码(约20个文件)到最后的稳定版本和“再升级”它一块一块,直到将再次出现错误。如果发生这种情况,我们可以

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

编辑:我们现在可以更新所有,但一个文件恢复到旧的国家没有得到连接问题。创建问题的文件是dorSynchronizer.pas,更确切地说是这个文件的r179导致的问题 - 线程已从Windows API更改为Delphi TThread那里。我们会进一步调查此问题,并可能在未来几天向DOR项目添加一个问题。

EDIT2:事实证明,DOR使用可能导致未定义行为的不推荐使用的过程TThread.Suspend和TThread.Resume。我向DOR项目报告了an issue