60

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

有谁知道摆脱我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。

更新:该库是开源的。

4

7 回答 7

65

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

于 2008-12-16T09:45:05.857 回答
36

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

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

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

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

现在,您可以将其视为您的代码,并随意调试。

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

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

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

于 2008-12-16T20:39:51.323 回答
7

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

于 2008-12-16T10:29:51.773 回答
1

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

于 2008-12-16T10:25:20.907 回答
1

为了使用 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 将自动下载适当的源代码并让您添加断点,而无需执行上述任何步骤;但是,我了解到您不能总是指望这一点。

于 2015-10-12T19:43:48.267 回答
0

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

于 2012-09-28T12:26:07.127 回答
0

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

于 2021-12-11T20:32:48.727 回答