如何在 Java 的 Eclipse 调试视图中过滤调用堆栈

Posted

技术标签:

【中文标题】如何在 Java 的 Eclipse 调试视图中过滤调用堆栈【英文标题】:How to filter call stack in Eclipse debug view for Java 【发布时间】:2011-04-28 15:49:43 【问题描述】:

在调试时,Eclipse 中的 Debug 视图会显示调用堆栈。这是伟大的。但我希望能够过滤掉所有我绝对不关心的调用,例如 Spring 和 JUnit runner。

这是我现在调用堆栈的一个示例。我想将条目保持为粗体,同时隐藏所有其他条目。有可能以任何方式做吗? (插件,下一个 Eclipse 版本,配置,...)

com.myproject.mymodule.MyFinderObject.fetchDestinationSettings
com.myproject.mymodule.MyFinderObject.compareCurrentSettings
com.myproject.mymodule.MyFinderObject.compareSettings
sun.reflect.NativeMethodAccessorImpl.invoke0
sun.reflect.NativeMethodAccessorImpl.invoke
sun.reflect.DelegatingMethodAccessorImpl.invoke
java.lang.reflect.Method.invoke
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
com.myproject.caching.CachingInterceptor.invoke
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed
org.springframework.aop.framework.JdkDynamicAopProxy.invoke
$Proxy43.doSthWith
com.myproject.mymodule.MyFinderObjectTest.testSettingComparisonForCurrentSettings
sun.reflect.NativeMethodAccessorImpl.invoke0
sun.reflect.NativeMethodAccessorImpl.invoke
sun.reflect.DelegatingMethodAccessorImpl.invoke
java.lang.reflect.Method.invoke
com.myproject.mymodule.MyFinderObjectTest
com.myproject.mymodule.MyFinderObjectTest
com.myproject.mymodule.MyFinderObjectTest
junit.framework.TestResult$1.protect
junit.framework.TestResult.runProtected
junit.framework.TestResult.run
com.myproject.mymodule.MyFinderObjectTest
junit.framework.TestSuite.runTest
junit.framework.TestSuite.run
org.junit.internal.runners.JUnit38ClassRunner.run
org.eclipse.jdt.internal.junit4.runner.JUnit4TestMethodReference
org.eclipse.jdt.internal.junit.runner.TestExecution.run
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main

【问题讨论】:

顺便问一下,你认为这会是一个合理的功能请求吗? 当然——听起来也没有那么难。将探索调试 API。 @espinchi,我在 IntelliJ 中使用了这个功能,它有很大帮助。 eclipse bug tracker 中有一个功能请求:2009 年报告,目前仍处于“NEW”状态:bugs.eclipse.org/bugs/show_bug.cgi?id=273194(此评论无助于解决问题,但至少其他人对此感兴趣,也不必搜索eclipse bug tracker) 还有一张 Eclipse Bug Tracker 中的票:bugs.eclipse.org/bugs/show_bug.cgi?id=513499(从 2017 年开始,状态:“ASSIGNED”) 【参考方案1】:

我知道过滤堆栈跟踪视图的唯一方法是通过 Mylyn。如果您有一个活动的 Mylyn 任务,并且您在调试视图中单击“关注活动任务(实验)”按钮,则堆栈跟踪将被过滤以仅显示当前任务上下文中的那些方法。

在这种情况下,您不会从堆栈跟踪中过滤某些项目;相反,默认情况下所有内容都会显示出来,并且只会显示某些项目(那些在任务上下文中的项目)。

您可以查看this 答案以了解有关 Mylyn 的更多信息。

【讨论】:

感谢您的信息。这对我的情况来说肯定太严格了。不过,如果没有人提出更好的建议,我会将其标记为已接受的答案。 您可以创建一个任务并将您的所有代码添加到上下文中,然后您就拥有了您想要的。不过我没试过。我能想到的唯一问题是 Mylyn 可能会尝试从上下文中删除长期未触及的项目。 “Mylyn 可能会尝试从上下文中删除长期未触摸的项目”。我认为这可以在首选项中进行更改:取消选择常规 > 编辑器“自动关闭编辑器”,并检查 Mylyn > 上下文中的设置,尤其是“编辑器”组中的设置。【参考方案2】:

准备工作:您可以按照here 的描述使用step filters。然后,每当您逐步调试代码时,它都不会跳转到排除的包或类中,例如来自 JDK 或一些框架,如 Hibernate 或 Spring。但这只是一个先决条件。

解决方案:堆栈跟踪仍然包含来自这些包的帧。为了过滤掉这些,您需要修补 Eclipse JDT Debug UI 插件。 Someone else 已经为直到 Indigo 的旧 Eclipse 版本做到了这一点。因为我很好奇我是否可以在当前版本的 Luna 4.4.1 中运行它,所以我重新创建了其他人的更改并将 Debug View + Stack Filter Plug-In 推送到 GitHub,包括补丁插件的下载链接。所以如果你也在 4.4.1 上,你是幸运的,不需要自己修补和编译任何东西。只需使用我的版本。否则,请克隆我的 repo 并查看更改,然后将它们应用到您选择的插件版本。

【讨论】:

甜蜜!感谢您的帮助! 嗨,我试图将 org.eclipse.jdt.debug.ui_3.6.300.201412061413.jar 放在 eclipse 的 dropin 文件夹中,但似乎什么也没发生……有什么想法吗?谢谢你 不知道。您使用的是 Luna 4.4.1 还是其他 Eclipse 版本?在替换之前当前安装了哪个 debug.ui 版本? 我尝试为 4.5.1 构建一个新版本,但没有成功。尽管构建 Eclipse 更像是一个问题。您能否再解释一下您在更改源代码后是如何构建插件的? 我真的不记得我是怎么做的了,但我想帮助快速而肮脏:我挑选了我对 R4_5_1 标签的提交,在 Eclipse 中构建了类文件(出现了问题Maven),从 Eclipse 下载原始 JAR 并手动将一个类文件修补到其中。试试this link,看看 JAR 是否适合你(未经测试!),请提供一些反馈。

以上是关于如何在 Java 的 Eclipse 调试视图中过滤调用堆栈的主要内容,如果未能解决你的问题,请参考以下文章

调试java程序时如何在eclipse中执行某些功能?

如何使用Eclipse的debug功能(转自百度经验)

Eclipse 的一些调试技巧

Eclipse:在调试透视图中悬停中断

在eclipse中监控java线程

更改 Eclipse 中调试视图的内容