【问题标题】:Techniques and tools for debugging problems on remote machines?在远程机器上调试问题的技术和工具?
【发布时间】:2011-07-17 03:19:52
【问题描述】:

用户一直在报告我无法在我的机器上重现的问题/崩溃/错误。我发现这些问题很难解决。

我已经开始使用 EurekaLog(太棒了!)和 SmartInspect。这两种工具都有很大帮助,但我仍然发现很难发现一些问题。

我刚刚购买了Debugging by David Agans(正在等待它到货)。

是否有任何其他特定于 Delphi 的工具或技术可以帮助解决这些难以发现的远程问题?我发现难以追踪的问题类型是那些没有引发异常或没有明确原因的问题。 EurekaLog 捕获异常,SmartInspect 非常好,一旦我有一个理论要检查。但在某些情况下,这是一个看似随机的崩溃,可能有几千行代码可能有问题。如何缩小根源?

【问题讨论】:

标签: delphi debugging


【解决方案1】:

MadExcept 是我使用的,非常棒。我也使用过 EurekaLog,发现功能几乎完全相同,只是我有更多使用 MadExcept 的经验和时间。非商业用途免费,商业用途价格合理。 更新: MadExcept 4 现已推出,甚至支持 64 位 Delphi XE2 应用程序,并且还具有内存泄漏检查功能。

当什么都没有发生时,我依赖大量使用跟踪日志记录。我有一个 TraceMessage(integer,string) 函数,我在所有应用程序中都调用它,当有人遇到问题时,我让他们单击一个菜单项,将调试跟踪级别调高到最详细的级别;它为我提供了我的应用程序所做的所有事情的完整历史,这比 madExcept 更能帮助我解决客户站点的问题。客户遇到崩溃,madexcept 发送的崩溃报告包含一个自动附加的日志文件(由我的应用程序创建)。我相信你可以用 madExcept 和 EurekaLog 做同样的事情。如果您需要一个日志系统,您可以下载 Log4D,也可以自己编写,非常简单。

为了永远免费,试试 JclDebug,它需要更多的设置工作,但对我来说也非常有效。

有关堆问题的帮助,请了解有关 fastMM(完整版)调试选项的更多信息。

而且您不应该忘记 Delphi 本身支持远程调试,如果您可以在办公室中没有安装 delphi 的机器上重现崩溃,请在办公室网络上使用远程调试而不是安装完整的 RAD Studio 安装在你工作的另一台机器上。您也可以使用远程调试通过 Internet 连接到客户端 PC 计算机,但我还没有尝试通过 Internet 进行远程调试,所以我不能说它是否在 Internet 上工作得很好。我确实知道,由于远程调试不支持自动部署您构建的 EXE 文件(您必须自己完成该部分),因此通过 Internet 远程调试到客户端 PC 的工作量更大。

通过修复所有提示和警告,然后使用 Peganza 的 CodeHealer 或 Pascal Analyzer (PAL),您可能还会发现很多问题。这些静态分析工具可以帮助您发现真正的代码问题。

如果性能和内存使用是您的问题,请获取完整版的 AQTime,并使用它来分析和观察您的系统运行情况。它将帮助您修复内存泄漏,并了解您的应用程序的运行时行为和内存使用情况,不仅仅是泄漏,还有内存和 CPU 使用的瓶颈。其中一些瓶颈也可能是一些奇怪问题的根源。我什至使用 AQTime 来帮助我找到死锁,因为它可以生成执行痕迹,这可以帮助我找出正在运行的代码并定位死锁。 更新: AQTime 不能安装在您的主要开发机器以外的机器上,除非违反新修改的 AQTime 许可条款。在过去的美好时光里,这些条款从未如此严格。

如果您更准确地了解您的问题是什么,我相信其他人可以为您提供更多具体的想法,但以上所有都是对我很有帮助的一般技术。

【讨论】:

  • 如果您将 AQTime 许可证安装在不属于您的机器上,您可能会违反该许可证。
  • 马里安;也许我的观点并不清楚。远程调试对于同一 LAN 上的 pc 来说是理想的,在远程调试情况下,通过 Internet 工作并不理想,因为您必须通过某种方式将目标 exe 获取到客户端的 pc 上,这可能会很慢或不可靠通过互联网。 (远程调试器不会在您每次重建并点击运行时将您的 EXE 或配置文件复制到客户端,通常您在同一个 LAN 上使用远程调试并映射驱动器,这就是您获取文件的方式)......现在清楚了吗?
  • 你的 TraceMessage() 函数对我来说可能是一个很好的尝试。是否有任何可以轻松添加多个 TraceMessage() 的 delphi 附加组件。 (手动添加所有调用会很乏味)。
  • 我选择了这个作为答案,因为这里似乎有很多很好的信息。但其他答案似乎也很有用。
  • Shannon 如果你需要追踪很多复杂的类型和数据,甚至是图片,那么看看 CodeSite。否则,一个简单的循环缓冲区和基于字符串的跟踪系统就可以了。如果需要,我可以发布我的跟踪缓冲区管理代码。
【解决方案2】:

最好的方法之一是使用Delphi自带的Remote Debugger,这样你就可以直接调试远程机器上运行的应用程序。远程调试器在某些 Delphi 版本中有些错误,需要仔细遵循说明才能使其正常工作,但在需要时它是一个需要考虑的工具。还要检查是否有适用于您的版本的更新,它们可能来自单独的安装程序,用于在“远程”系统上部署。否则首先安装远程调试器,然后检查安装的文件是否在本地安装中具有更新版本,以及远程计算机上的副本。

【讨论】:

    【解决方案3】:

    CodeSite 在这些情况下帮助了我很多。由于 XE,它与 Delphi 捆绑在一起。

    【讨论】:

    • codesite 真正的亮点在于它对复杂数据类型的支持。
    【解决方案4】:

    在这件事上,记录是关键。

    看看我们的TSynLog 类在我们的Open Source SynCommons library 中可用。

    它确实具有 JCL Debug / MadExcept 功能,以及一些附加功能(如客户端分析和日志记录):

    • 使用一组级别进行日志记录;
    • 快速、低执行开销;
    • 可以加载 .map 文件符号以用于日志记录;
    • 将 .map 压缩为二进制 .mab (900 KB -> 70 KB);
    • 将 .map/.mab 包含到 .exe 中;
    • 读取外部 .map 以将单元名称和行号添加到日志文件中,而在执行时没有 .map 可用信息;
    • 异常记录(Delphi 或低级异常),带有单元名称和行号
    • 带有单位和行号的可选堆栈跟踪
    • 方法或过程递归跟踪,使用接口输入和自动离开
    • 高分辨率时间戳,用于应用程序执行的客户端分析
    • 设置/枚举/TList/TPersistent/TObjectList/TContainer/动态数组JSON序列化;
    • 每线程或全局日志记录;
    • 同一进程上有多个日志文件;
    • 集成日志归档(zip 或任何其他格式);
    • 开源,适用于 Delphi 5 到 XE

    【讨论】:

    • 我完全同意。全面的跟踪记录在任何可测试、可证明正确的系统中都是必不可少的,并且对于您为客户提供支持的能力非常重要。
    猜你喜欢
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多