[英]Write stack trace of an exception into a file with Byteman
我有一個忽略其中異常的框架,我想檢查這些異常的原因。 我正在嘗試使用 Byteman 來做到這一點。
Byteman 可以將異常消息或目標方法本身的調用堆棧寫入日志文件,如下所示:
RULE PrintStackTrace
CLASS org.example.TargetClass
METHOD targetMethod
AT EXCEPTION EXIT
IF true
DO
traceOpen("log", "/tmp/byteman.log");
traceln("log", $^.getMessage());
traceStack(null, "log");
traceClose("log");
ENDRULE
但是我找不到編寫異常( $^
)的printStackTrace()
結果的方法。 $^.printStackTrace()
將堆棧跟蹤寫入控制台,但2>&1 logfile
之類的重定向無法將堆棧跟蹤寫入文件。
有沒有辦法用 Byteman 將異常的堆棧跟蹤( $^
)寫入文件?
可以執行此操作,但前提是您提供自定義 Helper class。
您可以通過調用獲得解決方案的一部分
$^.getOurStackTrace()
這是 Throwable 的一個私有方法,它返回一個 StackTraceElement[]。 這是用於組裝 printStackTrace 打印的數據的類型。 返回數組 StackTraceElement 的基礎 class 有一個 toString() 方法,該方法打印 Throwable 堆棧回溯中每個連續元素的方法、文件和行號。 因此,如果您定義自己的 Helper class 如下,您可以使用它使用從 Helper 繼承的 trace 方法將堆棧跟蹤打印到跟蹤文件:
package org.my;
import org.jboss.byteman.rule.helper.Helper
class MyHelper extends Helper {
public void traceStackElements(Object traceFile,
Throwable t,
StackTraceElement[] elements) {
traceln(tracefile, t.toString());
for (int i = 0; i < elements.length; i++) {
traceln(" at " + elements[i].toString());
}
}
}
您的規則需要將 MyHelper 指定為其助手 class 並調用這個額外的內置函數。
RULE PrintStackTrace
CLASS org.example.TargetClass
METHOD targetMethod
AT EXCEPTION EXIT
HELPER org.example.MyHelper
IF true
DO
traceOpen("log", "/tmp/byteman.log");
traceStackElements("log", $^, getOurStackTrace());
traceClose("log");
ENDRULE
您需要針對定義標准幫助程序 class 的 byteman.jar 編譯 MyHelper。 您還將確保 class 位於類路徑中,以便在注入規則時可以解決它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.