【问题标题】:How to debug large server side distributed Java application如何调试大型服务器端分布式 Java 应用程序
【发布时间】:2010-11-18 07:33:18
【问题描述】:

这是我的问题:我正在尝试调试 Apache Cassandra 并了解应用程序的流程。 IE。当客户端发送请求时,比如说 put(),调用了哪些方法以及系统内部是如何工作的。

所以,这就是我的想法:

  1. 在 cassandra 代码中编写一个 main 方法,该方法调用入口点 put() 方法,在 eclipse 等中放置断点等或
  2. 不要编写 main 方法,只需使用常规客户端(通过 TCP 访问服务器)和使用 log4j 记录器(已在 cassandra 中实现)“调试”(通过读取日志文件并理解代码)。

那么,我的问题是,调试这种分布式应用程序的理想方法是什么?

【问题讨论】:

    标签: java debugging log4j distributed-computing


    【解决方案1】:

    理想的方式?两者兼而有之。

    您提到了目标:“调试”和“了解应用程序的流程” - 好吧,在您了解流程之前很难进行调试,但了解本身可能就是目的。

    在现实世界中,在处理大型分布式系统时,通常不能依赖调试器,至少在最初是这样,尤其是因为某些问题仅在系统繁忙或运行数小时后才会出现。因此,在应用程序代码和基础架构代码中,良好的调试跟踪以及对该跟踪的细粒度控制至关重要。

    但是,如果您有机会在一个非常有启发性的调试器中运行。

    在所有这些之前,我认为您需要:

    一)。研究可能存在的任何设计文档。

    b)。在一个好的 IDE 中浏览源代码,例如。蚀。跟着控制就行了。嗯,这是一个有趣的地方,想知道它是从哪里调用的?在类上调用该方法,它有什么作用?什么时候调用构造函数?

    有了一些想法,跟踪跟踪就容易多了,而且你更清楚在哪里放置断点。

    【讨论】:

    • 那么,您说的是开发人员环境吧?我不关心应用程序是否在生产中运行。我的目标是重写 cassandra 中的一些现有协议。
    • 确实,最好对流程有一个印象,并通过生成的预期日志消息来验证这一点。从调试器开始只会让你陷入细节的泥潭,而且你对更大的图景(例如流程)一无所知。但是,将调试器附加到特定代码段(未满足您的期望)可能非常有启发性。
    • + 我在 Eclipse 中发现了远程调试。这也可能有帮助?
    【解决方案2】:

    如何使用 log4j 的 MDC,在 put() 之前设置它,然后在 put() 退出后清除它?然后你可以看到那里真正发生了什么,前提是你在 put() 内部执行的方法中设置了其他日志记录。如果您在该方法中的某个位置,请不时记录堆栈跟踪,这样您就可以看到当前所在的位置。

    免责声明:我的调试优先级列表如下:

    1. 检查堆栈跟踪
    2. 检查日志文件
    3. 使用调试器

    所以,如果 1. 和 2. 不给我答案,我会求助于调试器。

    在这样的分布式应用程序中,使用调试器听起来像是不得已而为之。

    【讨论】:

      【解决方案3】:

      在分布式应用程序中使用日志记录确实是了解更广泛范围内实际发生的情况以及事物如何交互的最佳方法之一。但是您最终将面临日志文件的问题 - 分布式系统可以生成大量日志文件,格式和位置各不相同。因此,如果您想使用 log4j(或类似工具)来处理类似的事情,您应该将日志汇总到一个地方,然后研究它们。 This tool 可能会有所帮助 - 它不仅允许持久聚合,还允许实时监控来自各种来源的聚合日志流。例如,您可以专注于来自特定主机(或主机范围)的数据层,并实时观察正在发生的事情。或者,您可以从特定机器上的特定线程中获取日志,或者使用 MDC 上下文,就像之前的海报已经提到的那样。我也赞同这样的观点,即分布式应用程序中的调试器在大多数情况下是无用的,并且出于显而易见的原因在生产系统中完全无用。另一方面,Log4j 非常灵活,使用广泛,是记录日志的最佳工具之一 (恕我直言)。

      【讨论】:

        【解决方案4】:

        使用日志,如果需要增加日志级别,添加更多日志语句。在分布式系统的不同组件中,分析不同的组件,如数据库、应用程序服务器、分析堆栈跟踪、使用 Web 应用程序内置的前端浏览器上的调试工具以及后端断点

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-01
          • 2021-10-21
          相关资源
          最近更新 更多