摘要: 我在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,以便调用方减少工作量。
这在飞镖上可行吗?
答案 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并请求某种机制以允许考虑比第一帧更多的内容。