UnCaughtException处理程序:解码回溯符号

时间:2014-05-08 06:13:33

标签: ios nsexception

我试图获得像Xcode listout这样的回溯符号,如下所示

*** First throw call stack:
(
    0   CoreFoundation                      0x018865e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x016098b6 objc_exception_throw + 44
    2   CoreFoundation                      0x01923903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x0187690b ___forwarding___ + 1019
    4   CoreFoundation                      0x018764ee _CF_forwarding_prep_0 + 14
    5   Foundation                          0x0124036c __NSFireDelayedPerform + 372
    6   CoreFoundation                      0x01844c46 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22
    7   CoreFoundation                      0x0184462d __CFRunLoopDoTimer + 1181
    8   CoreFoundation                      0x0182c698 __CFRunLoopRun + 1816
    9   CoreFoundation                      0x0182bb33 CFRunLoopRunSpecific + 467
    10  CoreFoundation                      0x0182b94b CFRunLoopRunInMode + 123
    11  GraphicsServices                    0x02c249d7 GSEventRunModal + 192
    12  GraphicsServices                    0x02c247fe GSEventRun + 104
    13  UIKit                               0x0037c94b UIApplicationMain + 1225
    14  CrashHandler                        0x000088ad main + 141
    15  libdyld.dylib                       0x06244725 start + 0
    16  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我试图从NSException中提取符号,如下面的代码所示。并且只提供较少的信息。

-(void)handleException:(NSException*)exception
{

    [exception callStackSymbols]//I've written this into file.

}

我的输出如下

*** First throw call stack: (
0   CoreFoundation                      0x326bd2bb <redacted> + 186
1   libobjc.A.dylib                     0x3a33b97f objc_exception_throw + 30
2   CoreFoundation                      0x326c0e07 <redacted> + 170
3   CoreFoundation                      0x326bf531 <redacted> + 392
4   CoreFoundation                      0x32616f68 _CF_forwarding_prep_0 + 24
5   Foundation                          0x32fcb277 <redacted> + 450
6   CoreFoundation                      0x326925df <redacted> + 14
7   CoreFoundation                      0x32692291 <redacted> + 272
8   CoreFoundation                      0x32690f01 <redacted> + 1232
9   CoreFoundation                      0x32603ebd CFRunLoopRunSpecific + 356
10  CoreFoundation                      0x32603d49 CFRunLoopRunInMode + 104
11  GraphicsServices                    0x361b62eb GSEventRunModal + 74
12  UIKit                               0x34519301 UIApplicationMain + 1120
13  CrashHandler                        0x0007f421 main + 116
14  libdyld.dylib                       0x3a772b20 <redacted> + 0
)

如何解码<redacted>符号?

参考和理解:

我已经提到SO post1SO post2但它需要dSYM文件,我们必须手动解码,就像testflight一样..没有dSYM文件,怎么做?< / p>

2 个答案:

答案 0 :(得分:2)

符号化是将内存地址转换为包含以下全部或部分元素的符号的过程:

  • class name
  • method name
  • file name
  • line number

当设备上的应用符号作为应用二进制文件的一部分进行符号化时,只能检索class namemethod name。无法以这种方式获得file nameline number

当使用应用程序dSYM进行符号化时,只要构建应用程序时所有信息都可用,就可以获取所有数据。例如。使用第三方静态库时,这些调用可能缺少文件名和行号。

<redacted>符号只能在设备上符号化系统框架地址时显示系统调用。 class name和/或method name未显示的原因是iOS内存优化。可以在此处找到对此的说明:https://devforums.apple.com/thread/171264 要对这些地址进行符号化,您需要使用iOS版本和CPU体系结构的iOS符号,这些符号用于在计算机上创建表示报告的堆栈跟踪。

可以将这些符号作为Xcode的一部分,或者将特定iOS版本和CPU架构的设备连接到Xcode,然后Xcode将获取符号。请注意,例如对于没有更新SDK的iOS错误修复版本,获取符号的唯一方法是使用设备。

计算机上的符号化可以使用Xcode管理器完成,也可以使用symbolciatecrash.pl脚本手动完成,该脚本是终端中手动Xcode的一部分。

要使用Xcode或脚本进行符号化,您需要一个完整的崩溃报告,其中包含的信息比您发布的堆栈跟踪更多。

要使用atos手动表示报告的框架地址,您还需要框架引用的每个二进制文件的加载地址,例如:来自FoundationCoreFoundationUIKit。显示的堆栈跟踪不提供此信息。 StackOverflow上有多个帖子如何手动使用atos

答案 1 :(得分:1)

如果没有dSYM bolication文件,则无法对跟踪进行符号化。 您可以尝试使用不剥离调试符号的选项来构建代码,但我不确定。

同时实施崩溃处理程序是一项非常微妙的任务,我将留给专业人士;) 然而,你可以给它一个try并且可能学习新东西。