我们有一个用delphi编写的应用程序,它使用Delphi On Rails作为服务器,并使用http、json和websockets与客户机通信。我们最近遇到了一些问题,很难调试它们并找到问题的根源。
使用wireshark进行流量分析,我们可以看到以下行为:有来自客户端的请求(http get用于文件)。通常,我们处理该请求并发送一个HTTP状态代码、文件(如果没有缓存)等。但是,我们有一个可复制的问题,只有
来自客户机的请求,来自服务器的tcp syn,但之后,服务器发送一个rst数据包,tcp通信停止。
奇怪的是,我们可以很好地重现这个问题(尽管第一个包中断通信的文件不同),并且在下列情况下它会神秘地消失:
在调试环境(Delphi IDE)中,禁用madExcept
在发布环境中,不使用madexptpatch修补可执行文件
将焦点放在与主应用程序窗口不同的窗口上。
由于delphi在Rails上有一些问题,为了避免访问冲突和调试异常,必须对它做一些小的修改,我怀疑dor是罪魁祸首,一些奇怪的内存损坏或不匹配的异常是bug,但它仍然令人困惑,特别是问题如果我们改变焦点,电磁波就会消失。
我的主要问题不是如何解决这个问题,而是如何调试它以及在哪里查找问题。TCP重置的来源也让我困惑,因为在这种情况下,我们不会碰到the usual procedures that process requests,它看起来像是DOR或其他什么东西(应用程序、Winsock、OS)错误地重置了连接。
为了完整起见,可能与此相关,这里是我在delphi on rails项目和一个论坛线程中报告的一些问题,我在该线程中向madextor作者询问了这个问题:Issue #6,Issue #7,Issue #8,forum entry。
最佳答案
作为一个测试,我们从版本控制中检查了一些旧的dor源,其中没有已知的连接问题,并且它在不显示任何上述问题的情况下工作。
所以我们决定反过来解决这个问题:将DOR特定的源代码(大约20个文件)回滚到最新的稳定版本,然后逐个“重新更新”它,直到错误再次出现。如果发生这种情况,我们可以
快速返回最新的工作版本
希望与原始dor源非常接近,这样我们就可以对库的更新做出反应。
分析发生的错误并向DOR项目报告一个详细的问题(甚至可能是一个解决方案)。
编辑:我们现在可以将除了一个文件以外的所有文件更新回旧状态,而不会出现连接问题。产生问题的文件是dorsynchronizer.pas,更确切地说,导致问题的是该文件的r179—线程从Windows API更改为delphi tthread。我们将对此进行进一步调查,并可能在未来几天向DOR项目添加一个问题。
edit2:原来DOR使用了不推荐使用的tthread.suspend和tthread.resume过程,这会导致未定义的行为。我向DOR项目汇报过。
关于delphi - 某些HTTP请求上的奇怪TCP重置(RST),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9691604/