Interstage Application Server/Interstage Web Server トラブルシューティング集 |
目次
索引
![]() ![]() |
第8章 J2EEアプリケーション開発・運用時の異常 | > 8.14 Javaアプリケーションのメソッドトレースの採取 |
異常のあるサーブレットを例として、トレース情報の見方について説明します。
*********************************************************************************** 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:(RequestFacade):org.apache.catalina.connector.RequestFacade@1526e3: (ResponseFacade):org.apache.catalina.connector.ResponseFacade@ac2d3c 2: in, org.apache.catalina.connector.ResponseFacade, setContentType, PARAM:(String):text/html; charset=iso-2022-jp 3: in, org.apache.catalina.connector.ResponseFacade, isCommitted, PARAM: 4: out, org.apache.catalina.connector.ResponseFacade, isCommitted, RET:(boolean):false 5: out, org.apache.catalina.connector.ResponseFacade, setContentType, RET:void 6: in, org.apache.catalina.connector.ResponseFacade, getWriter, PARAM: 7: in, org.apache.catalina.connector.ResponseFacade, isFinished, PARAM: 8: out, org.apache.catalina.connector.ResponseFacade, isFinished, RET:(boolean):false 9: out, org.apache.catalina.connector.ResponseFacade, getWriter, RET:(CoyoteWriter):org.apache.catalina.connector.CoyoteWriter@19f9c7a (以降、出力なし) ***********************************************************************************
この情報より、以下のことがわかります。
FreezeServletが正常に動作する場合には、上記のトレース情報に続いて以下の情報が出力されます。
*********************************************************************************** 10: in, org.apache.catalina.connector.RequestFacade, getParameter, PARAM:(String):SampleParameter 11: out, org.apache.catalina.connector.RequestFacade, getParameter, RET:(String):[] ・・・(略)・・・ 12: out, FreezeServlet, service, RET:void ***********************************************************************************
*********************************************************************************** 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="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:(RequestFacade):org.apache.catalina.connector.RequestFacade@d41f3: (ResponseFacade):org.apache.catalina.connector.ResponseFacade@64dd79 2: in, org.apache.catalina.connector.ResponseFacade, setContentType, PARAM:(String):text/html; charset=iso-2022-jp 3: in, org.apache.catalina.connector.ResponseFacade, isCommitted, PARAM: 4: out, org.apache.catalina.connector.ResponseFacade, isCommitted, RET:(boolean):false 5: out, org.apache.catalina.connector.ResponseFacade, setContentType, RET:void ・・・(略)・・・ 6: in, org.apache.catalina.connector.RequestFacade, getParameter, PARAM:(String):param ・・・(略)・・・ 7: out, org.apache.catalina.connector.RequestFacade, getParameter, RET:(String):?x?m?????Y 8: in, org.apache.catalina.connector.CoyoteWriter, println, PARAM:(String):data = ?x?m?????Y ・・・(略)・・・ 9: out, org.apache.catalina.connector.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で処理したいため、たとえば、次のようにします。
str=new String(str.getBytes("8859_1"), "shift_jis"); |
上記の処理を行うことによって、サーブレットのソースの12行目に正しくUNICODEの文字列が渡され、トレース情報の8行目の引数の値は以下のようになります。
*********************************************************************************** PARAM:(String):data = 富士通太郎 HEX=0064 0061 0074 0061 0020 003d 0020 5bcc 58eb 901a 592a 90ce ***********************************************************************************
目次
索引
![]() ![]() |