在 dart 中操作 StackTrace

Sco*_*ttF 5 stack-trace dart crashlytics flutter

摘要: 我在 dart 中有一个堆栈跟踪,我想删除帧 #0,然后调整整个堆栈跟踪(帧 #1 现在是帧 #0,帧 #2 现在是帧 #1)。

详细信息: 我在 dart 中编写了自己的断言类型函数,如果失败,将获取当前堆栈跟踪并发送到 crashlytics。

static void asrt(bool condition)
{
    if (condition)
        return;
    StackTrace stacktrace = StackTrace.current;
    Crashlytics.instance.recordError("assert triggered" , stacktrace);
}
Run Code Online (Sandbox Code Playgroud)

问题是 crashlytics 根据第一个堆栈帧识别每个错误。因此,我的所有错误都被识别为同一错误,因为我正在从同一方法获取堆栈跟踪。我知道我可以从调用者传递堆栈跟踪,但对我来说更好的解决方案是操作堆栈跟踪,以便调用者做更少的工作。

这在 Dart 中可行吗?

Sco*_*ttF 7

我最终得到了一个可靠的解决方案。

我使用了stack_trace 库及其提供的类 Trace 和 Frame。

在下面的示例中,trace.frames 返回一个不可变列表,因此我执行深度复制。我对此很满意,因为无论如何它只会在崩溃时运行。

    StackTrace stacktrace = StackTrace.current;
    Trace trace = Trace.from(stacktrace);
    List<Frame> frames = trace.frames;
    List<Frame> newFrames = List<Frame>();

    // start at index 1 to omit frame #0
    for (int i = 1; i <  frames.length; i++) {
        Frame f = frames[i];
        newFrames.add(Frame(f.uri , f.line , f.column , f.member));
    }

    Trace newTrace = Trace(newFrames);
Run Code Online (Sandbox Code Playgroud)