2009-08-20 63 views
31

这里是堆栈跟踪:从堆栈跟踪行号获取实际的jsp行号?

... 
org.apache.jsp.showcustomer_jsp._jspService(showcustomer_jsp.java:128) 
org.apache.jasper.runtime.HttpJspBase.service(Unknown Source) 

这是我做的:

  1. 获取从堆栈跟踪的行号,在这种情况下,128
  2. 找到showcustomer_jsp.java文件(它不是很明显,看看/var/run/tomcat-6/Catalina/localhost/_/org/apache/jsp)。
  3. 打开它,然后去线128
  4. 现在,搜索.jsp文件为任何你在_jsp.java文件上线128中。
  5. 热潮!你完成了!

请问,有没有更简单的方法来做到这一点?

+0

甚至不知道你可以做到这一点。 +1 – iandisme 2011-07-28 17:58:51

回答

2

我不认为你可以。 JSP文件被编译成一个servlet,而不是直接运行。由于此servlet引发异常,因此您在堆栈跟踪中的行是来自该类的行。此时JSP中的原始行已经丢失。

通常最好避免编写代码或从JSP抛出异常,并封装在servlet和JSP标记你的逻辑,并使用JSTL的控制流(如,的forEach等)

+2

WebLogic在WL10之前的版本中有一个很好的功能:它会在生成的Java文件中写入注释,显示源JSP行号。即使您的逻辑被封装在taglib中,也很高兴看到哪个调用被抛出。 – kdgregory 2009-08-20 11:18:10

+0

快速查看Jasper源代码似乎表明它将JSP文件作为标记流进行处理,而无需了解行号。所以答案是否定的。 – kdgregory 2009-08-20 11:41:15

+0

IDE具有计算原始行号的所有数据。也许有人可以写一个IntelliJ插件来完成这项工作。 – 2009-08-21 08:09:37

4

我发现Eclipse WTP FAQ上的这个page,它解释了如何配置Eclipse,以便您可以单击堆栈跟踪来转到生成的java代码。

+0

+1,但仍然 - 这会使您仅生成Java代码,而不是原始JSP。 – Juraj 2011-11-14 10:58:33

0

我曾经在Lex和Yacc中编写过可以生成C代码的代码,并且可以启用#line预处理器指令进行调试。当生成的c代码发生某些事情时,IDE足够聪明地打开相应的lex或yacc文件,而不是生成的c代码。 Surly

相关问题