【问题标题】:Eclipse - showing full call stack (like when it hits breakpoint in debugger) without putting in breakpoints?Eclipse - 显示完整的调用堆栈(例如当它在调试器中遇到断点时)而不放置断点?
【发布时间】:2011-10-06 10:02:53
【问题描述】:

我正在使用一个对我来说是新的旧 Java 应用程序,因此一种方法可以弄清楚它是如何工作的并更容易找到事情,我认为能够在我执行操作后获得完整的堆栈跟踪,以便能够根据特定的 UI 操作查看正在使用哪些类。我曾认为这在调试器中是可能的,但它似乎只有在我插入断点时才有效,在这种情况下,这样做的部分目的是让我不必知道调用什么来插入首先断点(因为这将有助于告诉我)。

如果这是一个基本问题,我深表歉意,我已经对此进行了搜索,但没有找到正确的答案。

【问题讨论】:

  • 从日志文件开始会不会更容易
  • 哪些日志文件?该应用程序使用tomcat服务器,我认为它不会记录它所做的每个方法调用,这是自动记录在我遗漏的其他地方吗(某种eclipse日志?)谢谢
  • 不,我指的是应用程序日志(我不知道 eclipse 或 tomcat 有任何自动日志记录)。所以,如果你幸运的话,遗留代码会有一定程度的日志记录。将日志级别设置为最低并运行 UI。
  • 是的,我担心这就是你的意思,不幸的是我没有那么幸运,它没有那种记录能力:)

标签: java eclipse debugging stack-trace


【解决方案1】:

您始终可以通过单击 Eclipse 中的“打开调用层次结构”(左键单击所选方法或 CTRL+ALT+H)来查看调用方法的位置。此外,您始终可以通过单击“打开声明”(左键单击选定的方法/类或 F3)来检查方法/类的定义位置。

【讨论】:

  • 是的,我知道这一切,这不是我要问的问题。我想根据特定操作获得完整的运行时调用,你说我应该这样做的方式需要手动完成每个方法调用等并追溯它,效率较低
【解决方案2】:

您始终可以使用 -verbose:class 的 VM arg 运行应用程序。然后,您可以观察控制台输出并查看当您执行特定操作时 VM 正在加载哪些类。这可能会为您提供放置断点的起点。根据具体情况,这并不总是有效,但可能会有所帮助。

【讨论】:

  • 我正在运行一个 tomcat 网络应用程序,所以我想也许我可以在 tomcat 中设置一个环境变量或其他东西来执行此操作,需要更多地研究它
【解决方案3】:

当您处于调试器透视图中时,您将看到一个显示已启动进程的视图。在该视图中,您可以告诉它暂停进程的所有线程。一旦停止,您将能够浏览线程以查看它们都在做什么。要尝试捕获特定操作正在执行的操作,您必须启动该操作,然后快速暂停所有线程。

【讨论】:

  • 你知道这个视图在Eclipse中叫什么吗?好像没找到,谢谢
  • 我想我知道你们现在的情况了,只是常规的“调试”选项卡,我尝试在操作期间暂停它,看起来我得到了一些堆栈跟踪,但不确定它是否全部它
  • 这个解决方案绝对是为反应良好的开发者准备的。 ;) 如果操作涉及长时间运行的过程,可能会有所帮助。
  • 我明白了,是的,它不是一个长时间运行的过程,它是一个网络应用程序,所以它只是快速调用加载页面等
  • 最常用于调试挂起的进程。
【解决方案4】:

您可以使用的另一个技巧是确定您知道哪些类必须包含在您尝试捕获的代码路径中。例如,您提到它是一个 Java EE Web 应用程序,因此该操作可能是某种 servlet 交互(在某种程度上)。我面前没有 API,但是您可以在检索输出流的响应对象中的方法上放置一个断点。一旦中断,您就会知道尝试为请求提供服务的代码。

【讨论】:

    【解决方案5】:

    一些建议:

    一些分析器允许您从任何特定方法向上(有时向下)查看正在调用和被调用的内容。我发现这个关于流程的令人惊讶的信息,即使在我认为我很熟悉的应用程序中也是如此。

    为了理解主线流程,我认为没有比与调试器交互工作更好的替代品了。它会引导你学习其他重要的事情。不是你想听到的,我知道。这假定您可以在错过关键出口匝道时快速重新启动应用程序。

    逆向设计大型遗留应用程序是我经常使用 UML 的一个地方。有太多的东西要留在我的脑海中,无法形成一幅好的大图。如果您有一个可以进行逆向工程的 UML 工具,请将其与应用程序一起加载,然后可能会大力修剪您不关心的类,因为它们是微不足道的或显而易见的。以有助于您理解的方式排列图表。我以这种方式使用了 Together、Magic Draw 和 Visual Paradigm。一起工作的效果最好 - 但那是十年前的事了。

    【讨论】:

    • 查看了更多内容,现在我正在使用分析工具:VirtualVM 看起来非常适合我的需求,基本上我只是想在运行时查看正在使用的类等这样我就可以根据它放置断点,无论如何,VirtualVM 是我向有类似问题的任何人推荐的东西
    • @Ed Staub 您能否更详细地解释如何使用您提到的技术(UML 和调试)来理解新的代码库?
    • @Hacke 已经 10 年了,我继续前进。
    【解决方案6】:

    这并不能直接回答您的问题,但也许它会更好地解决您的问题。看看BTrace。它允许您检测正在运行的 Java 应用程序并插入一些您自己的基本代码。例如,您可以让它写出整个方法调用链,以帮助您在应用程序中找到自己的方式。它有点类似于 AspectJ,但目的完全不同,并且不需要更改项目源代码:

    “BTrace 是一种安全的 Java 动态跟踪工具。BTrace 通过动态(字节码)检测正在运行的 Java 程序的类来工作。BTrace 将跟踪操作插入到正在运行的 Java 程序的类中,并热交换被跟踪的程序类。”

    【讨论】:

    • 感谢您的信息,是的,我认为这样的事情会很理想,实际上,我通过在我的工作中分配给我的任务遇到了一个 Web 应用程序监控应用程序,我认为它做了一些类似的事情(使用Java 代理),但这不是它的主要目的,所以 BTrace 在这种情况下可能更适合需要
    • 它看起来确实需要通过注释一些方法来进行一些修改,并使它们成为与项目的网络性质冲突的静态无效,我认为,但这对于将来的参考来说绝对是有趣的
    • @Rick:不,您不会更改项目源。注释和静态方法在您的跟踪代码中,完全在目标项目之外。 BTrace 附加到正在运行的 JVM 并在运行时将其跟踪例程注入其中。
    • “BTrace”链接已损坏;它会打开 oracle.com/splash/kenai.com/decommissioning/index.html 站点,该站点已关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    相关资源
    最近更新 更多