我不知道为什么我从来没有发现自己必须使用调试器来完成我的程序并看看发生了什么,可能是因为我习惯使用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。
答案 0 :(得分:2)
首先,必须使用某些参数启动java以插入调试器:
-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
是用于我们目的的参数。然后,使用IDE并远程连接调试器。您将断点设置为一段代码(请确保本地文件和远程程序完全相同)并生成错误。您也可以将断点设置为未捕获的异常。
作为提示:您可以更改引用的错误捕获JSP(我们的error.jsp),以便不仅显示捕获的异常(ex.getStracktrace)的堆栈跟踪,还显示导致的堆栈跟踪(ex.getCause( ).getStacktrace())。这可能有助于识别更高级别的异常原因。
编辑:对不起,如果没有IDE,这是一个人类无法做到的信息溢出。 Tomcat应用程序在架构级别上很复杂,在最简单的请求之间在许多不同的类之间切换。
答案 1 :(得分:1)
可能比将调试器挂钩到Tomcat更容易使用的替代解决方案:
首先,看看调用堆栈。在底部,您会看到名为org.sgrp.singer.filters.SingerLoginFilter
的班级。问题出在这里,方法doFilter
的第128行。
第一行是org.apache.jasper.JasperException: java.lang.NullPointerException
。这意味着你已经在上述类的第128行使用了一个值为null的对象。
查看该代码以找出可能出错的地方。另外,在代码中添加一些打印/日志记录语句。
调试应该是你最后的选择。您只需查看堆栈跟踪即可收集大量信息。
答案 2 :(得分: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 -attach localhost:8000
在这里,如果tomcat运行在不同的机器上,则localhost可以替换为运行tomcat的地方,并且可以用在tomcat中设置jvm的任何端口替换8000.
现在您可以调试,如果在jdb中键入help,则可以看到调试说明。
答案 3 :(得分:0)
我一直使用eclipse调试器,要么在eclipse中运行tomcat,要么将eclipse连接到一个单独的,但是本地到eclipse,jboss服务器。
像梦一样工作,无需改变jvm设置或其他任何东西。