如何从 Xcode 崩溃日志中准确找到崩溃发生的位置?
How to find exactly where a crash occurred from an Xcode crash log?
所以我有这个崩溃日志。从我可以从 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框架没有文件和行号?这是某种隐私问题吗?崩溃日志来自 Organizer 报告。我记得以前可以点击管理器中的功能,它会将我带到确切的位置。现在不知道是否是新的 Xcode 12.0 (12A7209) 破坏了它。它只打开 Xcode 中的堆栈,仅此而已。
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 非常有帮助 post。
请注意,在某些情况下,文件名或行号信息与原始源代码不对应。代码可能是编译器生成的,而不是在您的源文件中生成的,或者编译器可能已经优化了您的源代码,在这种情况下,优化的代码行可能与源代码不对应。
所以我有这个崩溃日志。从我可以从 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框架没有文件和行号?这是某种隐私问题吗?崩溃日志来自 Organizer 报告。我记得以前可以点击管理器中的功能,它会将我带到确切的位置。现在不知道是否是新的 Xcode 12.0 (12A7209) 破坏了它。它只打开 Xcode 中的堆栈,仅此而已。
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 非常有帮助 post。
请注意,在某些情况下,文件名或行号信息与原始源代码不对应。代码可能是编译器生成的,而不是在您的源文件中生成的,或者编译器可能已经优化了您的源代码,在这种情况下,优化的代码行可能与源代码不对应。