【问题标题】:How to find exactly where a crash occurred from an Xcode crash log?如何从 Xcode 崩溃日志中准确找到发生崩溃的位置?
【发布时间】:2020-09-24 10:52:59
【问题描述】:

所以我有这个崩溃日志。从我可以从 DateTimeHelper 收集到的函数中,我得到了一个它不期望的对象,并在其上执行该对象没有的函数。

我无法重现该问题,因此我不知道它在函数内部的确切位置。我可以从崩溃日志中找出一些方法吗?与函数条目 +176 的字节偏移量有帮助吗?正在执行的机器指令的地址是否有帮助?我完全不知道如何使用这两个数字。

0   CoreFoundation                  0x24c0f916 __exceptionPreprocess + 122 (NSException.m:162)
1   libobjc.A.dylib                 0x243aae12 objc_exception_throw + 34 (objc-exception.mm:531)
2   CoreFoundation                  0x24c152b0 -[NSObject(NSObject) doesNotRecognizeSelector:] + 184 (NSObject.m:333)
3   CoreFoundation                  0x24c12edc ___forwarding___ + 696 (NSForwarding.m:3149)
4   CoreFoundation                  0x24b3e234 _CF_forwarding_prep_0 + 20 (NSForwarding.s:641)
5   MyApp                           0xc83c4 +[DateTimeHelper dateFromServerFormat:withLocale:andTimeZone:] + 176

为什么 MyApp 框架没有文件和行号?这是某种隐私问题吗?崩溃日志来自管理器报告。我记得以前可以单击管理器中的功能,它会将我发送到确切的位置。现在不知道是不是新的 Xcode 12.0 (12A7209) 破坏了它。它只在 Xcode 中打开堆栈,仅此而已。

【问题讨论】:

  • 你有崩溃的构建的 .dSYM 吗?如果是这样,您可能可以使用atos 来查找行号。
  • 以前的用户建议我象征崩溃。我认为崩溃是象征性的,因为其中有函数名称而不是地址。然而,Apple 没有提供文件和代码行,显然你应该自己手动获取....

标签: objective-c debugging crash


【解决方案1】:

Apple 的自动符号化不提供发生崩溃的文件和代码行。

根据评论建议,我对代码进行了符号化。来自apple documentation 使用atos:

atos -arch <BinaryArchitecture> -o <PathToDSYMFile>/Contents/Resources/DWARF/<BinaryName>  -l <LoadAddress> <AddressesToSymbolicate>

Find your DSYM 崩溃版本的文件。如果您的构建设置为添加 DSYM,通常可以在存档版本中找到,或者如果已上传,您可以从 Apple 下载它。使用此图像替换其余模板:

替换占位符后,它应该如下所示:

atos -arch arm64 -o TouchCanvas.app.dSYM/Contents/Resources/DWARF/TouchCanvas -l 0x1022c0000 0x00000001022df754
ViewController.touchesEstimatedPropertiesUpdated(_:) (in TouchCanvas) + 304

另外this 是一个非常有用的帖子。

请记住,在某些情况下,文件名或行号信息与原始源代码不对应。代码可能不是在您的源文件中由编译器生成的,或者编译器可能已经优化了您的源代码,在这种情况下,优化的代码行可能与源代码不对应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-05
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多