Java 使用Byteman将异常的堆栈跟踪写入文件

Java 使用Byteman将异常的堆栈跟踪写入文件,java,exception,stack-trace,byteman,Java,Exception,Stack Trace,Byteman,我有一个忽略其中异常的框架,我想检查这些异常的原因。我正试图用拜特曼来做这件事 Byteman可以将异常消息或目标方法本身的调用堆栈写入日志文件,如下所示: RULE PrintStackTrace CLASS org.example.TargetClass METHOD targetMethod AT EXCEPTION EXIT IF true DO traceOpen("log", "/tmp/byteman.log"); traceln(&

我有一个忽略其中异常的框架,我想检查这些异常的原因。我正试图用拜特曼来做这件事

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日志文件的重定向无法将堆栈跟踪写入文件


有没有办法用Byteman将异常(
$^
)的堆栈跟踪写入文件?

只有在提供自定义帮助程序类的情况下,才可以这样做

您可以通过调用

$^.getOurStackTrace()

这是Throwable的私有方法,返回StackTraceElement[]。这是用于组装printStackTrace打印的数据的tyep。返回数组的基类StackTraceeElement有一个toString()方法,该方法为Throwable的堆栈回溯中的每个连续元素打印方法、文件和行号。因此,如果您按照以下方式定义自己的帮助器类,则可以使用它使用从帮助器继承的跟踪方法将堆栈跟踪打印到跟踪文件:

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());
    }
  }
}
您需要根据定义标准Helper类的byteman.jar编译MyHelper。您还将确保类位于类路径中,以便在注入规则时可以解析它

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