【问题标题】:Getting a call hierarchy in java在java中获取调用层次结构
【发布时间】:2010-11-14 21:31:16
【问题描述】:

我在追踪错误时遇到了很大的麻烦,知道哪个方法称为某个方法会很有帮助。有没有一种简单的方法可以从 java 中获取调用层次结构? Java 是应用程序的一小部分,因此我无法在 eclipse/net beans 中编译和运行整个应用程序,因此我无法访问 IDE 调试器的调用层次结构。

【问题讨论】:

  • 听起来你真的想要一个堆栈跟踪,而不是一个调用层次结构。 (是否可以编辑问题的主题?)
  • 堆栈跟踪是一个调用层次结构,除非我遗漏了一些细微的差别。
  • 调用层次结构是可以调用过程的所有位置的树。
  • 我必须同意 Stephen C 的观点,您所指的是堆栈跟踪。

标签: java call hierarchy


【解决方案1】:

Java 是应用程序的一小部分,因此我无法在 eclipse/net beans 中编译和运行整个应用程序,因此我无法访问 IDE 调试器的调用层次结构。

您根本不需要运行该应用程序。如果您在 Eclipse 中创建项目,则可以使用其内置的 Call Hierarchy 工具来查找调用方法的所有可能位置。

需要权衡:调用层次结构工具将为您提供调用方法的所有位置。如果您想/需要了解所有可能性,这是一个很好的选择。 Neslson 对Thread.currentThread().getStackTrace() 的建议将为您提供在您为此调用编程的过程中调用方法的位置。细微差别是您可能不会在此调用期间运行所有代码路径。如果您看到特定行为并想知道您是如何到达那里的,请使用getStackTrace() 选项。

【讨论】:

    【解决方案2】:

    最好的办法是抛出异常,立即捕获并分析堆栈跟踪。

    我相信这就是 Log4J 能够记录调用方法的方式。

    【讨论】:

    • 使用 Thread.dumpStack() 或一些不需要抛出人为异常的东西。
    • 你说得对,这就是 log4j 的做法。我认为这只是出于历史原因,因为 Java 1.5 可以使用 Nelson 建议的 currentThread().getStackTrace() 方法,因此不再需要这种方法。
    【解决方案3】:
    Thread.currentThread().getStackTrace();
    

    Exception ex = new Exception();
    ex.printStackTrace();
    

    它相当慢,但可以用于调试目的。 API docs here.

    【讨论】:

      【解决方案4】:

      您是否尝试过使用 Java 的远程调试功能? Google search to get you started if you haven't

      【讨论】:

        猜你喜欢
        • 2012-07-18
        • 2011-09-28
        • 1970-01-01
        • 2012-01-15
        • 2020-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多