« 开发一个调试JSP的Eclipse插件2(收藏)« »开发一个调试JSP的Eclipse插件4(收藏) »
开发一个调试JSP的Eclipse插件3(收藏)

开发一个调试JSP的Eclipse插件1(收藏)    
开发一个调试JSP的Eclipse插件2(收藏) 
开发一个调试JSP的Eclipse插件3(收藏)
开发一个调试JSP的Eclipse插件4(收藏)
开发一个调试JSP的Eclipse插件5(收藏)
开发一个调试JSP的Eclipse插件6(收藏)
  本文通过开发一个JSP 编辑器插件的示例,介绍了 Eclipse 中设置 JSP 断点的方法,以及如何远程调试 JSP。作为基础知识,本文的前两部分描述了 JAVA Debug 和 JSR-45 的基本原理。
  环境要求: 本文的代码是在 Eclipse3.0.0,JDK1.4.2 和 Tomcat5.0.5 上测试过的


 Tomcat 又将这个 JAVA 代码编译为 Hello_jsp.class,他们位于: $Tomcat_install_path$\work\Standalone\localhost\_ 目录下。但是 JSP 文件名/行号和 JAVA 行号的对应表(以下简称SMAP) 在哪里呢?答案是,它保存在 Class 中。如果用 UltraEdit 打开这个 Class 文件,就可以找到 SourceDebugExtension 属性,这个属性用来保存 SMAP。

  JVM 规范定义了 ClassFile 中可以包含 SourceDebugExtension 属性,保存 SMAP:

SourceDebugExtension_attribute {
  u2 attribute_name_index;
  u4 attribute_length;
  u1 debug_extension[attribute_length];
}

  我用 javassist 做了一个测试(javassist可是一个好东东,它可以动态改变Class的结构,JBOSS 的 AOP就利用了javassist,这里我们只使用它读取ClassFile的属性)
public static void main(String[] args) throws Exception{
   String[]files = {
   "E:\\Tomcat5_0_5\\work\\Catalina\\localhost\\_\\org\\apache\\jsp\\Hello_jsp.class",
   };
                
 for(int k = 0; k < files.length; k++){
    String file = files[k];
    System.out.println("Class : " + file);
    ClassFile classFile = new ClassFile(new DataInputStream(new FileInputStream(file)));
           
    AttributeInfo attributeInfo = classFile.getAttribute("SourceDebugExtension");
    System.out.println("attribute name :" + attributeInfo.getName() + "]\n\n");
    byte[]bytes = attributeInfo.get();
    String str = new String(bytes);
    System.out.println(str);   
   }
}
  这段代码显示了SourceDebugExtension 属性,你可以看到SMAP 的内容。编译JSP后,SMAP 就被写入 Class 中, 你也可以利用 javassist 修改 ClassFile 的属性。

  下面就是 Hello_jsp.class 中保存的 SMAP 内容:


SMAP
E:\Tomcat5_0_5\work\Catalina\localhost\_\org\apache\jsp\Hello_jsp.java
JSP
*S JSP
*F
+ 0 Hello.jsp
/Hello.jsp
+ 1 greeting.jsp
/greeting.jsp
*L
1:45
2:46
3:47
3:48
4:49
5:50
1#1:51
1:52
2:53
7#0:56
8:57
*E
  首先注明JAVA代码的名称:Hello_jsp.java,然后是 stratum 名称: JSP。随后是两个JSP文件的名称 :Hello.jsp、greeting.jsp。两个JSP文件共10行,产生的Hello_jsp共69行代码。最后也是最重要的内容就是源文件文件名/行号和目标文件行号的对应关系(*L 与 *E之间的部分)

  在规范定义了这样的格式:

  源文件行号 # 源文件代号,重复次数 : 目标文件开始行号,目标文件行号每次增加的数量
(InputStartLine # LineFileID , RepeatCount : OutputStartLine , OutputLineIncrement)

  源文件行号(InputStartLine) 目标文件开始行号(OutputStartLine) 是必须的。下面是对这个SMAP具体的说明:
1:45  2:46  3:47  3:48  4:49  5:50(没有源文件代号,默认为Hello.jsp)
                   开始行号   结束行号
Hello.jsp:    1 ->  Hello_jsp.java:    45
              2 ->                     46
              3 ->                     47           48
              4 ->                     49
              5 ->                     50

1#1:51  1:52  2:53(1#1表示 greeting.jsp 的第1行)
greeting.jsp:    1 ->  Hello_jsp.java:       51           52
                 2 ->                     53 
        
7#0:56  8:57(7#0表示 Hello.jsp 的第7行)
Hello.jsp:     7 ->  Hello_jsp.java:       56
               8 ->                     57

 


Tags: java基础  

原创文章如转载,请注明:转载自:飞扬部落编程仓库 : http://www.busfly.net/csdn/

本文链接地址:http://www.busfly.net/csdn/post/jsp_eclipse_debug_3.html

如果你喜欢本文,请顶一下,支持我,你的支持是我继续发好文章的最大动力。谢谢。
好东西需要分享,快把本文发给你的朋友吧~!~

     
相关文章:




◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
Feed订阅集
网站分类
勤劳致富^.^
最近发表
最新评论及回复
最近留言
随机推荐文章
Powered By Z-Blog   STYLE by busfly . FatMouse
Copyright © 2007 巴士飞扬技术博客. . 沪ICP备07027972号. 会员群1(VS为主):3769186.