2008-12-16 59 views
51

我从第三方库中得到一个类的NullPointerException。现在我想调试整个事情,我需要知道这个类是从哪个对象中持有的。但在我看来,我不能在第三方的课堂中设置断点。如何在Eclipse中的第三方库中设置断点?

有没有人知道我的麻烦出路?当然,我使用Eclipse作为我的IDE。

更新:库是开源的。

回答

31

最安全可靠的方式来做到这一点(的东西,实际上是有用的结束)是下载源(你说这是开源的),并设置另一个“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的代码的大部分内容 - 您可以找出错误的可能性非常低。

58

您可以轻松地设置第三方库中的方法断点,而无需使用源代码。只要打开课程(你会看到“我没有来源”的视图)。打开大纲,右键单击所需的方法,然后单击Toggle Method Breakpoint以创建方法断点。

+2

这需要使用调试符号编译第三方库。 – 2011-03-03 19:11:23

+0

啊,也许不是......但我发现我不能在ServletResponse接口中放置一个方法断点,而我可以把它放在实现类(ServletResponseWrapper)中。 – 2011-03-03 19:18:59

+1

不可用了... – kolobok 2014-09-19 14:48:46

1

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

6

您还可以设置特定例外的断点。从Debug的角度,有一个按钮“添加Java异常断点”,在那里你可以添加“NullPointerException”。只要引发这样的异常,您的调试器就会暂停执行。

1

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

1

为了使这个工作与Maven物化的Web应用程序,我不得不做三件事情。

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

2)从pom.xml依赖关系中删除对jar的引用。

3)将新的eclipse项目添加到项目属性中的部署程序集。

4)将新的eclipse项目添加到项目属性 - > Java Build Path - >引用第三方项目的现有项目的项目中。

如果第三个项目已经正确添加到你的maven仓库中,那么maven会自动下载适当的源代码并让你添加断点而不必执行上述任何步骤;不过,我已经了解到,你不能总是依靠这一点。