Interstage Application Server トラブルシューティング集
目次 索引 前ページ次ページ

第8章 J2EEアプリケーション開発・運用時の異常> 8.13 Javaアプリケーションのメソッドトレースの採取

8.13.3 異常のあるサーブレットの例

 異常のあるサーブレットを例として、トレース情報の見方について説明します。

■例:応答がなくなるFreezeServlet

  ***********************************************************************************
    1:  import javax.servlet.http.*;
    2:  import javax.servlet.*;
    3:  import java.io.*;
    4:  public class FreezeServlet extends HttpServlet
    5:  {
    6:    public void service (HttpServletRequest request, HttpServletResponse response)
    7:    throws ServletException, IOException {
    8:      try {
    9:        response.setContentType("text/html; charset=iso-2022-jp");
   10:        PrintWriter out = response.getWriter();
   11:        FreezeClass fc=new FreezeClass();
   12:        String outString = fc.getString();
   13:        String tmpStr = request.getParameter("SampleParameter");
   14:        out.println(outString+tmpStr);
   15:      } catch (Exception e) {
   16:    }
   17:  }
  ***********************************************************************************

 このサーブレットを実行して採取したトレース情報が以下であるときの説明をします。日時、スレッド名、および16進出力は省略しています。

1 : in, FreezeServlet, service, PARAM:(CoyoteRequestFacade):org.apache.coyote.tomcat4.CoyoteRequestFacade@4ade31:(CoyoteResponseFacade):org.apache.coyote.tomcat4.CoyoteResponseFacade@41a0eb
2 : in, org.apache.coyote.tomcat4.CoyoteResponseFacade, setContentType, PARAM:(String):text/html; charset=iso-2022-jp
3 : in, org.apache.coyote.tomcat4.CoyoteResponseFacade, isCommitted, PARAM:
4 : out, org.apache.coyote.tomcat4.CoyoteResponseFacade, isCommitted, RET:(boolean):false
5 : out, org.apache.coyote.tomcat4.CoyoteResponseFacade, setContentType, RET:void
6 : in, org.apache.coyote.tomcat4.CoyoteResponseFacade, getWriter, PARAM:
7 : in, org.apache.coyote.tomcat4.CoyoteResponseFacade, isFinished, PARAM:
8 : out, org.apache.coyote.tomcat4.CoyoteResponseFacade, isFinished, RET:(boolean):false
9 : out, org.apache.coyote.tomcat4.CoyoteResponseFacade, getWriter, RET:(CoyoteWriter):org.apache.coyote.tomcat4.CoyoteWriter@2bccb2

(以降、出力なし)

 この情報より、以下のことがわかります。

  1. FreezeServlet.javaの9行目、10行目で呼び出しているHttpServletResponseのメソッドは、メソッド呼び出し時、メソッドからの復帰時にそれぞれのトレース情報が出力されていることから、呼び出された後、復帰していることがわかります。
  2. トレース対象である13行目のHttpServletRequestのgetParameterメソッドのトレース情報が出力されていないことより、この行が実行されていないことがわかります。
  3. 1、2より、FreezeServlet.javaの11行目、12行目のどちらかの処理が復帰していない、ということがわかります。

 FreezeServletが正常に動作する場合には、上記のトレース情報に続いて以下の情報が出力されます。

10: in, org.apache.coyote.tomcat4.CoyoteRequestFacade, getParameter, PARAM:(String):SampleParameter
11: out, org.apache.coyote.tomcat4.CoyoteRequestFacade, getParameter, RET:(String):[]
12: out, FreezeServlet, service, RET:void

■例:出力が文字化けするCodeMissServlet

  ***********************************************************************************
    1:  import javax.servlet.http.*;
    2:  import javax.servlet.*;
    3:  import java.io.*;
    4:  public class CodeMissServlet extends HttpServlet
    5:  {
    6:    public void service (HttpServletRequest request, HttpServletResponse response)
    7:    throws ServletException, IOException {
    8:      response.setContentType("text/html; charset=iso-2022-jp");
    9:      PrintWriter out = response.getWriter();
   10:      out.println("<HTML><HEAD><TITLE>CodeMissServlet</TITLE></HEAD><BODY><H1>");
   11:      String str=request.getParameter("param");
   12:      out.println("data = "+ str );
   13:      out.println("</H1><BR></BODY></HTML>");
   14:    }
   15:  }
  ***********************************************************************************

 下記のHTMLから“富士通太郎”と入力します。

  ***********************************************************************************
    <HTML>
    <HEAD>
    <META http-equiv="Content-Type" content="text/html; charset=shift_jis">
    <TITLE>CodeMissServlet</TITLE>
    </HEAD>
    <BODY>
    <FORM method="post" action="servlet/CodeMissServlet">
    <INPUT name="param" size="30">
    <INPUT type="submit" value="Submit">
    <INPUT type="reset" value="Reset">
    </FORM>
    </BODY>
    </HTML>
  ***********************************************************************************

 Webブラウザへの出力

data = ?x?m?????Y

 採取したトレース情報が以下であるときの説明をします。日時、スレッド名、および16進出力は省略しています。

1 : in,CodeMissServlet, service, PARAM:(CoyoteRequestFacade):org.apache.coyote.tomcat4.CoyoteRequestFacade@27e2ee:(CoyoteResponseFacade):org.apache.coyote.tomcat4.CoyoteResponseFacade@23b359
2 : in,org.apache.coyote.tomcat4.CoyoteResponseFacade, setContentType, PARAM:(String):text/html; charset=iso-2022-jp
3 : in,org.apache.coyote.tomcat4.CoyoteResponseFacade, isCommitted, PARAM:
4 : out,org.apache.coyote.tomcat4.CoyoteResponseFacade, isCommitted, RET:(boolean):false
5 : out,org.apache.coyote.tomcat4.CoyoteResponseFacade, setContentType, RET:void
・・・(略)・・・
6 : in,org.apache.coyote.tomcat4.CoyoteRequestFacade, getParameter, PARAM:(String):param
7 : out,org.apache.coyote.tomcat4.CoyoteRequestFacade, getParameter, RET:(String):?x?m?????Y
8 : in,org.apache.coyote.tomcat4.CoyoteWriter, println, PARAM:(String):data = ?x?m?????Y
・・・(略)・・・
9 : out,org.apache.coyote.tomcat4.CoyoteWriter, println, RET:void
・・・(略)・・・
10: out,CodeMissServlet, service, RET:void

 このとき、引数および戻り値の情報の出力が有効になっていた場合、トレース情報の7行目、8行目において、引数および戻り値はそれぞれ次のように出力されます。
 なお、getParameterメソッドの戻り値は、Webブラウザから受け取ったデータを%デコードして戻り値としています。HEXvalue=[0095 0078 008e 006d・・・]は、Shift JISの富(0x9578)、士(0x8e6d)、通(0x92ca)を表しています。

7 :(略) RET:(String):?x?m?????Y HEX=0095 0078 008e 006d 0092 00ca 0091 00be 0098 0059
8 :(略) PARAM:(String):data = ?x?m?????Y HEX=0064 0061 0074 0061 0020 003d 0020 0095 0078 008e 006d 0092 00ca 0091 00be 0098 0059

 この値より、サーブレットのソースの12行目(トレース情報の8行目)においてPrintWriterオブジェクトのprintlnメソッドに引数として渡した文字列がUNICODEではなく、Shift JISであることがわかります。
 この例の場合、サーブレットで受け取ったコード系をUNICODEで処理したいため、たとえば、次のようにします。

 上記の処理を行うことによって、サーブレットのソースの12行目に正しくUNICODEの文字列が渡され、トレース情報の8行目の引数の値は以下のようになります。

PARAM:(String):data = 富士通太郎 HEX=0064 0061 0074 0061 0020 003d 0020 5bcc 58eb 901a 592a 90ce


目次 索引 前ページ次ページ

Copyright 2006 FUJITSU LIMITED