3

我不知道为什么我从来没有发现自己必须使用调试器来单步调试我的程序并查看发生了什么,可能是因为我习惯于使用解释性语言,例如 PHP,在其中添加调试代码变得非常容易(print_r) 并实时查看更改。

然而,有了这个新的 Java 项目,我觉得我必须学习正确的调试方法。

所以这个不是我写的程序在Tomcat上运行并使用基本的JSP。问题是当我尝试访问一个特定的 JSP 页面时,它会抛出一个异常并给我所发生的事情的堆栈跟踪:

org.apache.jasper.JasperException: java.lang.NullPointerException
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:503)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:363)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:306)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    org.sgrp.singer.filters.SingerLoginFilter.doFilter(SingerLoginFilter.java:128)

我将如何使用 JDB 之类的工具逐步完成我的程序?我不能真正单步执行一个特定的类,因为我需要模仿我的 JSP 正在做什么......我想通过命令行来做这件事,而不使用 IDE。

4

4 回答 4

2

首先,必须使用某些参数启动 java 才能插入调试器:

-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n

是用于我们目的的参数。之后,您使用 IDE 并远程连接调试器。你给一段代码设置断点(请确保本地文件和远程程序的版本完全相同)并产生错误。您也可以为未捕获的异常设置断点。

作为提示:您可以更改引用的错误捕获 JSP(对于我们来说是 error.jsp)以不仅显示捕获的异常的堆栈跟踪(ex.getStracktrace),还显示导致堆栈跟踪(ex.getCause().getStacktrace ())。这可能有助于识别更高级别的异常原因。

编辑:对不起,如果没有 IDE,这是人类可能无法做到的信息溢出。Tomcat 应用程序在架构级别上是复杂的,为了最简单的请求在许多不同的类之间切换。

于 2010-11-03T13:23:35.420 回答
1

另一种解决方案可能比将调试器挂钩到 Tomcat 更容易使用:

首先,看一下调用堆栈。在底部,您会看到名为 的类org.sgrp.singer.filters.SingerLoginFilter。问题出在 method 的第 128 行doFilter

第一行说org.apache.jasper.JasperException: java.lang.NullPointerException。这意味着您在上述类的第 128 行使用了一个值为 null 的对象。

查看该代码以找出可能出现的问题。此外,在您的代码中添加一些打印/记录语句。

调试应该是你最后的手段。只需查看堆栈跟踪,您就可以收集大量信息。

于 2010-11-03T13:24:03.400 回答
1

可以使用 JDB,但它不是我的首选。

这是一个很好的解释如何使用它: http ://www.javaworld.com/javaworld/javaqa/2000-06/04-qa-0623-jdb.html

您需要记住在编译文件并设置 Tomcat 时包含调试信息,以便能够连接到它,这是字符串,如其他帖子所述:

-Xdebug -Xnoagent -Djava.compiler=NONE-Xrunjdwp:server=y, transport=dt_socket,address=8000,suspend=y

8000 可以替换为任何其他数值。它基本上告诉 jvm 在该端口上侦听调试器。

现在会发生什么,tomcat 将启动,但会自行挂起并等待调试器附加,然后再继续。

启动 JDB 并附加:

jdb -附加本地主机:8000

在这里,如果 localhost 在另一台机器上运行,则可以将 localhost 替换为运行 tomcat 的位置,并且可以将 8000 替换为您在 tomcat 中设置 jvm 的任何端口。

现在可以调试了,在jdb中输入help就可以看到调试说明。

于 2010-11-03T15:39:56.467 回答
0

我一直使用 eclipse 调试器,或者在 eclipse 中运行 tomcat,或者将 eclipse 连接到一个单独的但本地到 eclipse 的 jboss 服务器。

像梦一样工作,无需更改 jvm 设置或任何东西。

于 2010-11-03T13:26:42.403 回答