了解Objective-C抛出调用堆栈



一位用户刚刚向我提交了一份错误报告,说我的应用程序崩溃了。用户还附加了一个抛出调用堆栈。

造成问题的部分似乎是:

       3   My App                0x000000010d005483 My App + 17539

有没有办法将该地址和/或+ 17539转换为代码中的行号?

请记住,我无法在我的机器上重现这个错误,所以我不能只在调试模式下构建它。

查看苹果的技术说明。

此跟踪与您在调试器中停止执行时看到的类似,只是没有为您提供方法或函数名称(称为符号)。相反,你有十六进制地址和可执行代码——你的应用程序或系统框架——它们指的是它们。您需要将这些地址映射到符号。与Mac OS X的崩溃日志不同,iPhone OS日志在写入时不包含符号信息。您必须先对iPhone操作系统日志进行符号化处理,然后才能对其进行分析。

我一直在使用GDB进行手动符号化。如果你经常这样做,那就太麻烦了,但典型的崩溃日志没有太多符号,我只需要偶尔象征一次崩溃日志。

程序如下:

  1. 将应用程序的.dSYM文件放在与.app相同的文件夹中*
  2. 打开步骤1中的文件夹中的"终端"one_answers"cd"
  3. 在GDB中启动您的应用程序:
    $ gdb YourApp.app/Contents/MacOS/YourApp
  4. 设置打印asm-demangle和打印符号文件选项:
    set print asm-demangle on
    set print symbol-filename on
  5. 使用p/a命令查找堆栈跟踪中每个地址的行号:
    p/a 0x000000010d005483

这些说明来自此页面(显然不再在线)。

*请注意,.dSYM有一个UDID,将其与创建时使用的特定构建绑定在一起。所以,如果你没有原始的.dSYM文件,你就有麻烦了。从理论上讲,您甚至不能从源代码管理中提取相同的修订并重新生成,因为这个UDID会有所不同。

最新更新