我们有一个用 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、论坛条目。