【问题标题】:iOS Swift - Remove last method from stacktraceiOS Swift - 从堆栈跟踪中删除最后一个方法
【发布时间】:2022-11-17 07:53:41
【问题描述】:

我有一个实用程序方法用于在我的项目中记录各种非致命错误。在这种方法中,我还通过其 record() 方法将错误发送给 Crashlytics,但是在查看 Crashlytics 时,所有错误都被组合到一个实例中,因为堆栈跟踪中的最后一个信息是我的 xUtilityClassCrashlytics.crashlytics().record(error: error) 被称为)。

我可以在调用Crashlytics.crashlytics().record(error: error)之前从堆栈跟踪中删除关于最后一个方法的引用吗?以及如何去做? 还有其他方法吗?

我正在寻找一种方法来告诉 Crashlytics 我的所有非致命事件都不是来自同一行代码,而是来自调用该行的那一行,这样所有事件就不会组合在一起。

【问题讨论】:

  • 我没有使用 Crashlytics 的经验,但从浏览文档来看,似乎 record(exceptionModel:) 做了你想要的。
  • @MartinR 我使用了record(exceptionModel:) 而不是record(error:),但我丢失了所有堆栈跟踪信息,除了我手动添加的自定义信息。也许我可以通过检索当前堆栈跟踪、删除最后一项并将其添加到自定义 exceptionModel 来解决这个问题。我以前没有想过这个...

标签: ios swift crash crashlytics stack-trace


【解决方案1】:

一般来说,崩溃将根据突出显示的受指责的框架分组在一起,而不一定是堆栈跟踪中的顶部框架。这意味着如果同一个帧被归咎于两者,则具有不同堆栈跟踪的崩溃可能会导致相同的问题。

这就是我所说的被指责的框架的意思:

如果最新的框架与您的实用程序方法相关,并且是被框架的那个,扩展您在评论中提到的关于使用 ExceptionModel 的内容,我想出了这个解决方法:

var exMod = ExceptionModel.init(name: NSURLErrorDomain, reason: "some reason")
var stack: [StackFrame] = [];

// The current stack trace is obtained after removing the first element
for frame in Thread.callStackSymbols.dropFirst(){

   // The frame is a String, the address value is obtained and appended to the stack array.
   let frameArray = frame.description.split(separator: " ");

   // The address is a String and is converted to a UInt value
   let address = UInt(frameArray[2].dropFirst(2), radix: 16) ?? 0
   stack.append(StackFrame(address: address));
}
// The stack trace is added to the ExceptionModel
exMod.stackTrace = stack;
Crashlytics.crashlytics().record(exceptionModel: exMod)

这是在没有“.dropFirst()”的情况下运行此 sn-p 的结果:

这是删除第一个元素的结果:

如您所见,第一个元素已按预期删除。

我的建议是首先尝试在您的应用程序的不同部分造成不同的崩溃,然后查看是否是同一帧引起的。即:检查这些崩溃是否继续分组。

然后检查上述 sn-p 是否适用于您的用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多