2010-11-03 11 views
3

我不知道爲什麼我從來沒有發現自己必須使用調試器才能瀏覽我的程序,看看發生了什麼,可能是因爲我習慣使用解釋型語言比如PHP,它可以非常容易地添加調試代碼(print_r)並且可以看到更改。調試從Tomcat運行的Java程序(JSP)

但是,對於這個新的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) 

我怎麼會通過我的程序中使用的工具步驟如加多寶?因爲我需要模仿我的JSP正在做什麼......我想通過命令行執行此操作,而不使用IDE,所以我無法真正完成特定的類。

回答

1

的替代解決方案,可能會更容易比掛鉤調試器到Tomcat使用:

首先,看看調用堆棧。在底部,您會看到名爲org.sgrp.singer.filters.SingerLoginFilter的班級。問題出在這裏,在方法doFilter的第128行。第一行說org.apache.jasper.JasperException: java.lang.NullPointerException。這意味着你已經在提到的類的第128行使用了一個值爲null的對象。

查看代碼,找出可能出錯的地方。另外,在代碼中添加一些打印/日誌記錄語句。

調試應該是你的最後手段。只需查看堆棧跟蹤即可收集大量信息。

+0

是的,但有沒有像JDB進入SingerLoginFilter類並運行該函數doFilter並在該行上設置一個斷點,這樣我就可以在它被調用之前看到它正在獲取什麼值。 – 2010-11-03 13:34:34

+0

@Luca:我沒有親自使用JDB調試Tomcat。也許這個鏈接可以幫助你:http://mo.morsi.org/blog/node/219。從那篇文章,「停止在org.sgrp.singer.filters.SingerLoginFilter:128」是你需要的。試試Google搜索「jdb tomcat」 – darioo 2010-11-03 13:38:56

2

首先,Java已經與某些參數開始插件調試器:

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

是用於我們的目的的參數。之後,您使用IDE並遠程連接調試器。您將一個斷點設置爲一段代碼(請確保本地文件和遠程程序版本完全相同)並生成錯誤。您也可以將斷點設置爲未捕獲的異常。

作爲一個提示:您可以改變您引用的錯誤捕獲JSP(error.jsp爲我們)不僅顯示捕獲的異常(ex.getStracktrace)的堆棧跟蹤,而且還導致堆棧跟蹤(ex.getCause ().getStacktrace())。這可能有助於識別更高級別的異常原因。

編輯:對不起,沒有IDE,這是一個信息溢出,可能是人類無法做到的。 Tomcat應用程序在架構級別上很複雜,爲了最簡單的請求,在許多不同的類之間切換。

+0

我知道IDE提供這個...是否有可能沒有和IDE? – 2010-11-03 13:25:17

+0

當然可以。像Eclipse這樣的IDE只在後臺使用普通的Java調試器。集成調試器使用的每個函數在普通JDK的命令行調試器中都有相應的功能。您應該檢查[jdb的文檔](http://download.oracle.com/javase/1.3/docs/tooldocs/solaris/jdb.html)。在我的例子中的端口是8000,所以綁定應該去那裏。 – 0xCAFEBABE 2010-11-03 15:12:20

+1

沒有IDE,你可以用jdb做一些debbugging。 jdb -attach 0.0.0.0:8000 2>&1 | tee java_debug.log 嘗試並使用命令:幫助,線程,跟蹤go方法線程<0xnnnn><0xnnnn> ...請參閱jdb手冊docs.oracle.com/.../jdb gaoithe 2014-11-26 10:55:24

0

我一直使用eclipse調試器,要麼在eclipse中運行tomcat,要麼將eclipse連接到單獨的,但本地到eclipse,jboss服務器。

像夢一樣工作,不需要改變jvm設置或任何東西。

1

JDB可以使用,但它不會是我的第一選擇。

這裏是一個很好的解釋如何使用它: http://www.javaworld.com/javaworld/javaqa/2000-06/04-qa-0623-jdb.html

你需要記住,包括調試信息,當您編譯文件,並設置了Tomcat的,所以你可以連接到它,這是串,如由其他訊息中提到:

-Xdebug -Xnoagent -Djava.compiler = NONE-Xrunjdwp:服務器= Y,運輸= dt_socket,地址= 8000,暫停= Y

8000可以通過任何被替換其他數值。它基本上告訴jvm在該端口上偵聽調試器。

現在會發生什麼,是否tomcat會啓動,但暫停自己並等待調試器附加,然後再繼續。

開始JDB並附加:

加多寶-attach本地主機:8000

在這裏

,本地主機可以通過這裏Tomcat正在運行,如果是在不同的機器上運行,並且8000可以與任何端口替換被替換你在tomcat中設置jvm。

現在您可以進行調試了,如果您在jdb中鍵入help,則可以看到調試指令。