2017年11月8日水曜日

Byteman traceln()やtraceStack()を標準出力ではなくファイルに出力する

JavaプロセスをWindowsサービスとして稼働したり、バックグラウンド起動してターミナルは終了した場合に、Byteman の トレース関数(traceln()やtraceStack())の出力先となる標準出力が無くデバッグが困難となるケースがあります。

このようなケースでは、以下のように traceOpen()でトレース出力先をファイルに向けることで対処できます。

----- sample.btm -----
# トレースを別ファイルに出力
RULE outFile
CLASS sample.SimpleImpl
METHOD getCount
AT ENTRY
IF TRUE
  DO
  traceOpen("myIdentifier01", "C:\dev\myByteman\myByteman.trc");
  traceln("myIdentifier01","---mytrace---"+new java.util.Date());
  traceStack(null,"myIdentifier01");
  traceClose("myIdentifier01");
ENDRULE
-----

$ cat myByteman.trc

---mytrace---Wed Nov 08 00:06:55 JST 2017
Stack trace for thread main
sample.SimpleImpl.getCount(SimpleImpl.java:-1)
sample.MainClass.execute(MainClass.java:15)
sample.MainClass.main(MainClass.java:7)
---mytrace---Wed Nov 08 00:06:58 JST 2017
Stack trace for thread main
sample.SimpleImpl.getCount(SimpleImpl.java:-1)
sample.MainClass.execute(MainClass.java:15)
sample.MainClass.main(MainClass.java:7)
---mytrace---Wed Nov 08 00:07:01 JST 2017
Stack trace for thread main
sample.SimpleImpl.getCount(SimpleImpl.java:-1)
sample.MainClass.execute(MainClass.java:15)
sample.MainClass.main(MainClass.java:7)
(・・・)
----

public boolean traceOpen(Object identifier, String filename)
identifire はトレース出力先を示す識別子になります。

public void traceStack(String prefix, Object key)
prefix に null を指定すると、“Stack trace for thread <current>\n”がスタックトレースの先頭に表示され、<current> には Thread.currentThread().getName() が代入されます。

0 件のコメント:

コメントを投稿