在飞镖中操纵StackTrace

时间:2020-06-26 14:34:21

标签: flutter dart crashlytics stack-trace

摘要: 我在dart中有一个stacktrace,我想在其中删除第0帧,然后进行整个stacktrace的调整(第1帧现在是第0帧,第2帧现在是第1帧)。

详细信息: 我已经用dart编写了自己的assert类型函数,如果失败,它将捕获当前的堆栈跟踪并发送给crashlytics。

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

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

这在飞镖上可行吗?

2 个答案:

答案 0 :(得分:3)

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

我使用了stack_trace library及其提供的类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);

答案 1 :(得分:0)

我不推荐使用,但是您可以使用StackTrace.toString(),对其进行文本处理,然后使用StackTrace.fromString来获得StackTrace对象。

但实际上,我建议您file an issue against firebase_crashlytics并请求某种机制以允许考虑比第一帧更多的内容。