在 dart 中操作 StackTrace

Manipulate StackTrace in dart

总结: 我在 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);
}

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

这在 dart 中可行吗?

我不推荐它,但你可以使用 StackTrace.toString(),对其进行文本操作,然后使用 StackTrace.fromString 返回一个 StackTrace 对象。

但我真的建议你 file an issue against firebase_crashlytics 并请求一些机制来允许考虑比第一帧更多的内容。

我最终找到了可靠的解决方案。

我使用了 stack_trace library 及其提供的 类 Trace and Frame。

在下面的示例中,trace.frames returns 是一个不可变列表,因此我执行了深拷贝。我对此很满意,因为它只会在崩溃时运行。

    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);