代码之家  ›  专栏  ›  技术社区  ›  Luca Matteis

调试从Tomcat(JSP)运行的Java程序

  •  3
  • Luca Matteis  · 技术社区  · 15 年前

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

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

    所以这个程序,我没有写,运行在Tomcat上,使用基本的jsp。问题是,当我试图访问一个特定的JSP页面时,它会抛出一个异常,并向我提供发生情况的stacktrace:

    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 回复  |  直到 15 年前
        1
  •  1
  •   darioo    15 年前

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

    首先,看一下调用堆栈。在底部,您将看到名为 org.sgrp.singer.filters.SingerLoginFilter . 问题就在这里,在方法的第128行 doFilter .

    org.apache.jasper.JasperException: java.lang.NullPointerException . 这意味着您在所提到的类的第128行使用了一个值为空的对象。

    检查代码以找出可能的错误。另外,在代码中添加一些打印/日志记录语句。

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

        2
  •  2
  •   0xCAFEBABE    15 年前

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

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

    提示:您可以更改引用的错误捕获JSP(error.JSP for us),以便不仅显示捕获到的异常的stacktrace(ex.getStracktrace),还显示导致stacktrace(ex.getCause().getStacktrace())。这可能有助于识别更高级别的异常原因。

        3
  •  1
  •   Roman Goyenko    15 年前

    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并附加:

    在这里,如果本地主机运行在另一台机器上,那么它可以被tomcat运行的位置所替代,并且8000可以被您在tomcat中设置的任何jvm端口所替代。

    现在可以调试了,如果在jdb中键入help,就可以看到调试指令。

        4
  •  0
  •   NimChimpsky    15 年前