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