我从第 3 方库的类中获得 NullPointerException。现在我想调试整个事情,我需要知道该类是从哪个对象中保存的。但在我看来,我无法在第 3 方的类中设置断点。
有谁知道摆脱我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。
更新:该库是开源的。
我从第 3 方库的类中获得 NullPointerException。现在我想调试整个事情,我需要知道该类是从哪个对象中保存的。但在我看来,我无法在第 3 方的类中设置断点。
有谁知道摆脱我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。
更新:该库是开源的。
您可以轻松地在 3rd 方库中设置方法断点,而无需源代码。只需打开课程(您将获得“我没有来源”视图)。打开大纲,右键单击您想要的方法并单击Toggle Method Breakpoint
以创建方法断点。
最可靠的方法(最终得到一些真正有用的东西)是下载源代码(你说它是开源的),然后设置另一个指向该源的“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 的代码的任何内容 - 您能够找出问题所在的可能性非常低。
您还可以在特定异常上设置断点。从调试的角度来看,有一个“添加 Java 异常断点”按钮,您可以在其中添加“NullPointerException”。一旦引发此类异常,您的调试器就会暂停执行。
通常,您应该能够设置断点。特别是如果 3rd 方库是开源的。但是,如果您的第 3 方库来自商业供应商,他们可能已经在关闭调试标志的情况下编译了源代码。这将使您无法对其进行调试。您的供应商可能已将其作为混淆过程的一部分,以使其无法对库进行逆向工程,或者仅仅是因为最终编译的类会更小。
为了使用 maven 物化 Web 应用程序来完成这项工作,我必须做三件事。
1) 使用第 3 方 jar 的源代码创建一个新的 eclipse 项目。
2) 从 pom.xml 依赖项中删除对 jar 的引用。
3)在项目属性中将新的eclipse项目添加到Deployment Assembly。
4) 将新的 eclipse 项目添加到项目 Properties -> Java Build Path -> Projects 中引用 3rd 方项目的现有项目。
如果第三个项目已正确添加到您的 maven 存储库中,并且带有源代码,maven 将自动下载适当的源代码并让您添加断点,而无需执行上述任何步骤;但是,我了解到您不能总是指望这一点。
只需附加源(或使用自动附加源 jar 的东西),然后通过双击感兴趣行的左侧以正常方式设置断点。
在 maven 项目中,您可以轻松地在项目浏览器视图中打开 maven 依赖项树视图,并查看项目所依赖的 jar 文件列表。打开项目资源管理器,然后展开您的项目。然后,查找 maven 依赖项并展开此树视图。现在,您可以展开任何 jar 文件并查看可用类的列表,然后在其中任何一个上按 Enter,Eclipse 将为您反编译源代码,您可以设置断点。如果您的项目有子 maven 模块项目,您应该在模块中查找依赖项。我推荐安装Enhance 类反编译器插件,这样你就可以在没有源代码的情况下轻松调试你的项目,或者你可以为 eclipse 指定源以避免找不到源调试时。如果第三方jar文件的源已经在eclipse中作为项目打开,则不能在Maven依赖项中展开它。