我们有一个用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 #6,Issue #7,Issue #8,forum entry。
不知道这是否会有所帮助,但Windows会重置连接到侦听套接字,这些套接字有大量未尝试的连接,它们不是'accept()'ed。 “大量积压”没有特别明确的定义,但应该是一个合理的数字。 – cha0site 2012-03-13 20:45:18
这可能是一个系统问题,特别是当你在谈论“改变焦点”,因此也许尝试询问serverfault? – pmod 2012-03-13 20:59:54