簡體   English   中英

使用 Byteman 將異常的堆棧跟蹤寫入文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM