【发布时间】:2010-09-27 02:45:59
【问题描述】:
我在来自 3rd 方库的类中收到 NullPointerException。现在我想调试整个事情,我需要知道该类是从哪个对象中保存的。但在我看来,我无法在第 3 方的类中设置断点。
有没有人知道解决我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。
更新:该库是开源的。
【问题讨论】:
标签: java eclipse debugging breakpoints
我在来自 3rd 方库的类中收到 NullPointerException。现在我想调试整个事情,我需要知道该类是从哪个对象中保存的。但在我看来,我无法在第 3 方的类中设置断点。
有没有人知道解决我的麻烦的方法?当然,我使用 Eclipse 作为我的 IDE。
更新:该库是开源的。
【问题讨论】:
标签: java eclipse debugging breakpoints
您可以轻松地在 3rd 方库中设置方法断点,而无需源代码。只需打开课程(您将获得“我没有来源”视图)。打开大纲,右击你想要的方法,点击Toggle Method Breakpoint,创建方法断点。
【讨论】:
The Class File Viewer cannot handle the given input ('org.eclipse.ui.ide.FileStoreEditorInput'). 它应该在主文件菜单中的“打开文件...”对话框中工作还是有一个特殊的对话框?
做到这一点(并最终得到一些真正有用的东西)最可靠的方法是下载源代码(你说它是开源的),然后设置另一个指向该源代码的“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 的代码的任何内容 - 您能够找出问题所在的可能性非常低。
李>【讨论】:
-g选项进行了编译?该文档指出-g : Generate all debugging information, including local variables.,然后仅提及source、lines 和variable。我在 coderanch 上读到 real names of fields 也被使用 coderanch.com/t/262054/java-programmer-SCJP/certification/… 。但是没有提及 cmets。
-g 选项可以让我们毫无问题地进行调试,也就是说,能够使调试器与代码保持同步。我想这样做的唯一方法是让类文件“保持不变”。这是这样做的吗?注意:我一直在寻找有关此的明确信息,但似乎生成一个带有 & 然后不带 -g 的 jar 是找出使用 -g 选项时实际变化的唯一方法。
您还可以在特定异常上设置断点。从调试的角度来看,有一个“添加 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 class decompiler plugin,这样你可以在没有源代码的情况下轻松调试你的项目,或者你可以为eclipse指定源以避免在调试时source not found。如果第三方jar文件的源已经在eclipse中作为项目打开,你可以不要在 Maven 依赖项部分展开它。
【讨论】: