Eclipse - 显示完整的调用堆栈(比如它在调试器中遇到断点)而没有放入断点?

时间:2011-07-15 19:03:00

标签: java eclipse debugging stack-trace

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

如果这是一个基本问题,我道歉,我已经搜索了这个,但我找不到正确的答案。

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

您始终可以使用-verbose:class的VM arg运行应用程序。然后,您可以观察控制台输出,并在执行特定操作时查看VM正在加载的类。这可能会为您提供断点的起点。这取决于场景并不总是有效,但可能会有所帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

一些建议:

某些分析器允许您从任何特定方法(有时向下)走,以查看正在呼叫和被呼叫的内容。即使在我认为我熟悉的应用程序中,我也发现了关于流量的惊人信息。

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

反向设计大型遗留应用程序是我经常使用UML的地方。在我的脑海中留下太多的东西来形成一幅好的大局。如果您有一个可以进行逆向工程的UML工具,请使用该应用程序加载它,然后可能会严重删除您不关心的类,因为它们很简单或显而易见。以有助于您理解的方式排列图表。我以这种方式使用了Together,Magic Draw和Visual Paradigm。一起工作最好 - 但是十年前。

答案 5 :(得分:-1)

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