如何在第三方库的 Eclipse 中设置断点?

Posted

技术标签:

【中文标题】如何在第三方库的 Eclipse 中设置断点?【英文标题】:How to set a breakpoint in Eclipse in a third party library? 【发布时间】:2010-09-27 02:45:59 【问题描述】:

我在来自 3rd 方库的类中收到 NullPointerException。现在我想调试整个事情,我需要知道该类是从哪个对象中保存的。但在我看来,我无法在第 3 方的类中设置断点。

有没有人知道解决我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。

更新:该库是开源的。

【问题讨论】:

【参考方案1】:

您可以轻松地在 3rd 方库中设置方法断点,而无需源代码。只需打开课程(您将获得“我没有来源”视图)。打开大纲,右击你想要的方法,点击Toggle Method Breakpoint,创建方法断点。

【讨论】:

这要求第三方库编译时带有调试符号。 啊,也许不是……但我发现我不能在 ServletResponse 接口中放置方法断点,而我可以在实现类( ServletResponseWrapper )中放置一个方法断点。 @AdamMonsen 我理解这种混乱,但如果你仔细想想,当然你不能在抽象方法上放置一个有意义的断点......这个方法永远不会被调用,没有二进制文件可以编织一个断点进去。 Eclipse 没有“在此方法的所有覆盖开始处放置断点”的功能,只是在特定的具体实现中放置断点。 @akapelko 它在当前版本的 Eclipse 中仍然存在很多......也许你误解了方向?给出的步骤是打开类文件,然后以该类文件为焦点,打开“大纲”视图,然后右键单击那里的方法。您不会在类文件编辑器中看到类大纲。它也可以从 Package Explorer 中方法的右键菜单中获得。 这还能用吗?当我打开一个类文件时,我只得到The Class File Viewer cannot handle the given input ('org.eclipse.ui.ide.FileStoreEditorInput'). 它应该在主文件菜单中的“打开文件...”对话框中工作还是有一个特殊的对话框?【参考方案2】:

做到这一点(并最终得到一些真正有用的东西)最可靠的方法是下载源代码(你说它是开源的),然后设置另一个指向该源代码的“Java 项目” .

为此,请在系统的某个位置下载并解压缩源代码。单击“文件”->“新建”->“Java 项目”。在下一个对话框中,给它一个项目名称并选择“从现有源创建项目”。浏览到开源库的根目录。

假设项目所需的所有其他库等都包含在您下载的项目中,Eclipse 将解决所有问题并为您设置构建路径。

您需要从项目的构建路径中删除开源 jar,并将这个新项目添加到项目的构建路径中。

现在,你可以把它当作你的代码,随意调试。

这至少解决了其他方法的几个问题:

    您可以“附加源”到 jar 文件,但如果 jar 文件是在没有调试信息的情况下编译的,这仍然不起作用。如果 jar 文件是使用调试信息编译的(lines,source,vars...参见http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html,以及-g 选项)。

    您可以添加一个“异常断点”来查看何时引发 NullPointerException,但这是一个常见的异常,很可能会在您之前被引发并处理很多次(数百次?)寻找。另外,如果没有原始来源,您将无法真正看到有关引发 NullPointerException 的代码的任何内容 - 您能够找出问题所在的可能性非常低。

    李>

【讨论】:

在调试外部库时,如果我们在这个库的类中看到了cmets,是否意味着它已经使用-g选项进行了编译?该文档指出-g : Generate all debugging information, including local variables.,然后仅提及sourcelinesvariable。我在 coderanch 上读到 real names of fields 也被使用 coderanch.com/t/262054/java-programmer-SCJP/certification/… 。但是没有提及 cmets。 我希望-g 选项可以让我们毫无问题地进行调试,也就是说,能够使调试器与代码保持同步。我想这样做的唯一方法是让类文件“保持不变”。这是这样做的吗?注意:我一直在寻找有关此的明确信息,但似乎生成一个带有 & 然后不带 -g 的 jar 是找出使用 -g 选项时实际变化的唯一方法。 “从现有源创建项目”自 Eclipse Indigo 以来不存在;只需取消选中“使用默认位置”并浏览到解压缩源的位置。 ***.com/a/10369262/733092【参考方案3】:

您还可以在特定异常上设置断点。从调试的角度来看,有一个“添加 Java 异常断点”按钮,您可以在其中添加“NullPointerException”。一旦引发此类异常,您的调试器就会暂停执行。

【讨论】:

这不会捕获库中抛出的异常。可能有关于 Bent 所说的未设置调试标志的内容。 我从未见过这种情况。 JVM 仍然有堆栈跟踪,只是没有源代码或行号,所以它仍然应该在异常时中断。 我用它来捕捉 Eclipse 中的一个 servlet 异常,调试一个我似乎无法在应用程序代码本身中捕捉到的问题。非常感谢这个提示!【参考方案4】:

通常,您应该能够设置断点。特别是如果 3rd 方库是开源的。但是,如果您的第 3 方库来自商业供应商,他们可能已经在关闭调试标志的情况下编译了源代码。这将使您无法对其进行调试。您的供应商可能已将其作为混淆过程的一部分,以使对库进行逆向工程变得不可能,或者仅仅是因为最终编译的类会更小。

【讨论】:

debug标志是否关闭我会问同事。【参考方案5】:

要使用 maven 物化 Web 应用程序来完成这项工作,我必须做三件事。

1) 使用第 3 方 jar 的源代码创建一个新的 eclipse 项目。

2) 从 pom.xml 依赖项中删除对 j​​ar 的引用。

3) 在项目属性中将新的 eclipse 项目添加到 Deployment Assembly。

4) 将新的 eclipse 项目添加到项目 Properties -> Java Build Path -> Projects 中引用 3rd 方项目的现有项目。

如果第三个项目已正确添加到您的 maven 存储库,带有源,maven 将自动下载适当的源代码并让您添加断点,而无需执行上述任何步骤;但是,我了解到您不能总是指望这一点。

【讨论】:

【参考方案6】:

只需附加源(或使用自动附加源 jar 的东西),然后通过双击感兴趣的行的左侧以正常方式设置断点。

【讨论】:

在调试与开源项目链接的应用程序时,这种方法对我帮助很大。在我的情况下,我有(a)一个带有类的 jar,(b)一个带有相应源的 jar,以及(c)我将源解压缩到我的本地驱动器。为了在 Open Source 项目中的函数上放置断点,我 (1) 在 Eclipse 中打开了特定的本地驱动源文件,并且 (2) 在所需的函数行上放置了断点。当我运行我的应用程序时,Eclipse 足够聪明,可以在所需的位置中断。【参考方案7】:

在 maven 项目中,您可以轻松地在项目资源管理器视图中打开 maven 依赖项树视图,并查看项目所依赖的 jar 文件列表。 打开项目资源管理器,然后展开您的项目。 然后,查找 maven 依赖项并展开此树视图。 现在,您可以展开任何 jar 文件并查看可用类的列表,然后在其中任何一个上按 Enter,Eclipse 将为您反编译源代码,您可以设置断点。 如果您的项目有子 maven 模块项目,您应该在模块中查找依赖项。 我推荐安装Enhance class decompiler plugin,这样你可以在没有源代码的情况下轻松调试你的项目,或者你可以为eclipse指定源以避免在调试时source not found。如果第三方jar文件的源已经在eclipse中作为项目打开,你可以不要在 Maven 依赖项部分展开它。

【讨论】:

以上是关于如何在第三方库的 Eclipse 中设置断点?的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt creator 的发布模式下设置断点

如何在代码中设置断点来调试 PHP

使用 Gulp 时如何在 IDEA 中设置 Chrome 识别的断点?

VS2013中设置全局属性

如何在 Google Chrome 的内联 Javascript 中设置断点?

如何链接(或解决)两个定义相同符号的第三方静态库?