We're working to support source-level JSP debugging
for Tomcat 5 using its JSR-045 support.  However,
we've been unsuccessful at getting this to work
because the line to code index map that we retrieve
from our SourceDebugExtension JDWP request
does not agree with the  SMAP that was generated
when my example JSP was compiled.  The SMAP appears
to be correct but for whatever reason the line
mapping returned from the JVM has little in common
with the SMAP.  Perhaps there's something we're missing
and are not properly requesting that the SMAP be
placed in the class file?

We've tried searching the documentation, Google,
Usenet, and the Tomcat mail lists and bugzilla to no avail.
We've already gotten our debugging implementation working
properly with WebLogic 7.0 and 8.1 so I have a high degree
of confidence that once this mapping issue is
resolved we'll also have a source-level JSP debugging
solution for Tomcat 5 also.  We really want to have an open
source option available for JSP debugging and right
now we're so close so any help or information at all is
GREATLY appreciated.

Here are the details of our test environment:
Platform: Window 2000, latest SP
JDK: 1.4.1_02-b06
Tomcat: Version 5.0.2 (alpha)
Tomcat 5 JSP servlet settings from web.xml:
    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>logVerbosityLevel</param-name>
            <param-value>WARNING</param-value>
        </init-param>
        <init-param>
            <param-name>classdebuginfo</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>suppressSmap</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>dumpSmap</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>development</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>



For the test, we attempt to set a breakpoint on line 18, which
according to the SMAP corresponds to line 62 of the servlet.
Here's the test JSP, with line numbers for convenience.
1  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2  <%@ page language="java" import="java.lang.*,java.util.*" %>
3  <%
4  String path = request.getContextPath();
5  String basePath =
"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";
6  %>
7  <HTML>
8       <HEAD>
9      <BASE HREF="<%=basePath%>">
10      <TITLE>My JSP 'TestJSP.jsp' starting page</TITLE>
11     </HEAD>
12
13     <BODY>
14         <%
15            Date date = new Date();
16            out.println("Current time is: " + date);
17              out.println(".  ");
18              date = new Date();
19              out.println("Now the time is " + date);
20              out.println(".  ");
21          %>
22          <BR>This is my test JSP page. <BR>
23      </BODY>
24  </HTML>


Here's the SMAP generated by Tomcat:
SMAP
C:\dev\ApacheGroup\Tomcat
5.0.2alpha\work\Catalina\localhost\TomcatTest\org\apache\jsp\TomcatTestJSP_j
sp.java
JSP
*S JSP
*F
+ 0 TomcatTestJSP.jsp
/TomcatTestJSP.jsp
*L
1:42
4,3:45
7:49
8:50
9:51
9:52
9:53
10:54
10:55
11:56
13:57
15,7:59
22:67
22:68
23:69
24:70
*E


Here's the generated servlet.  As you can see,
line 62 is correct for the breakpont request from
line 18 of the JSP file.
1     package org.apache.jsp;
2
3     import javax.servlet.*;
4     import javax.servlet.http.*;
5     import javax.servlet.jsp.*;
6     import java.lang.*;
7     import java.util.*;
8
9     public final class TomcatTestJSP_jsp extends
org.apache.jasper.runtime.HttpJspBase
10        implements org.apache.jasper.runtime.JspSourceDependent {
11
12      private static java.util.Vector _jspx_dependants;
13
14      public java.util.List getDependants() {
15        return _jspx_dependants;
16      }
17
18      public void _jspService(HttpServletRequest request,
HttpServletResponse response)
19            throws java.io.IOException, ServletException {
20
21        JspFactory _jspxFactory = null;
22        PageContext pageContext = null;
23        HttpSession session = null;
24        ServletContext application = null;
25        ServletConfig config = null;
26        JspWriter out = null;
27        Object page = this;
28        JspWriter _jspx_out = null;
29
30
31        try {
32          _jspxFactory = JspFactory.getDefaultFactory();
33          response.setContentType("text/html;charset=ISO-8859-1");
34          pageContext = _jspxFactory.getPageContext(this, request,
response,
35             null, true, 8192, true);
36          application = pageContext.getServletContext();
37          config = pageContext.getServletConfig();
38          session = pageContext.getSession();
39          out = pageContext.getOut();
40          _jspx_out = out;
41
42          out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01
Transitional//EN\">\r\n");
43          out.write("\r\n");
44
45    String path = request.getContextPath();
46    String basePath =
"http://"+request.getServerName()+":"+request.getServerPort()+path+"/";
47
48          out.write("\r\n");
49          out.write("<HTML>\r\n\t");
50          out.write("<HEAD>\r\n\t\t");
51          out.write("<BASE HREF=\"");
52          out.write(String.valueOf(basePath));
53          out.write("\">\t\t\r\n\t\t");
54          out.write("<TITLE>My JSP 'TestJSP.jsp' starting page");
55          out.write("</TITLE>\r\n\t");
56          out.write("</HEAD>\r\n\r\n\t");
57          out.write("<BODY>\r\n\t  ");
58
59        Date date = new Date();
60        out.println("Current time is: " + date);
61          out.println(".  ");
62          date = new Date();
63          out.println("Now the time is " + date);
64          out.println(".  ");
65
66          out.write("\r\n\t\t");
67          out.write("<BR>This is my test JSP page. ");
68          out.write("<BR>\r\n\t");
69          out.write("</BODY>\r\n");
70          out.write("</HTML>\r\n");
71        } catch (Throwable t) {
72          if (!(t instanceof javax.servlet.jsp.SkipPageException)){
73            out = _jspx_out;
74            if (out != null && out.getBufferSize() != 0)
75              out.clearBuffer();
76            if (pageContext != null) pageContext.handlePageException(t);
77          }
78        } finally {
79          if (_jspxFactory != null)
_jspxFactory.releasePageContext(pageContext);
80        }
81      }
82    }


Everything so far looks good, but the map of JSP line numbers
to Java line numbers returned from the JVM looks like this:
 {62=[268], 79=[400], 43=[89],  48=[154],
  59=[227], 32=[23],  34=[35],  73=[360],
  70=[337], 60=[236], 61=[261], 68=[323],
  75=[377], 63=[277], 66=[309], 81=[422],
  27=[17],  64=[302], 28=[20],  38=[64],
  57=[220], 37=[57],  51=[175], 23=[5],
  40=[78],  72=[350], 49=[161], 54=[199],
  71=[344], 22=[2],   53=[192], 21=[0],
  33=[27],  78=[394], 52=[182], 24=[8],
  42=[82],  36=[50],  26=[14],  55=[206],
  50=[168], 67=[316], 39=[71],  76=[382],
  45=[96],  74=[364], 46=[104], 25=[11],
  56=[213], 69=[330]}


  This mapping obviously isn't correct since neither
  file is over 82 lines in length, line 18 has
  no entry at all, and it has nothing in common with
  the SMAP.

  Again,  all this code is working flawlessly with the
  JSR-045 implementation in WebLogic 7 & 8.
  Is JSR-045 fully supported in this release of Tomcat?
  If so, what  can be done to correct this mapping issue?
  Is this a known problem and we just have to wait?
  Are we doing something incorrectly?

  Again, all information is greatly appreciated.

  Thanks in advance,
  Todd




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to