理解Objective-C抛出调用堆栈

时间:2012-01-10 01:46:52

标签: objective-c crash osx-lion callstack

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

似乎导致问题的部分是:

       3   My App                0x000000010d005483 My App + 17539

有没有办法将该地址和/或+ 17539翻译成代码中的行号?

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

2 个答案:

答案 0 :(得分:3)

从Apple查看此Tech note

  

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

答案 1 :(得分:1)

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

程序如下:

  1. 将应用的.dSYM文件放在与.app。*
  2. 相同的文件夹中
  3. 从步骤1打开终端并cd到该文件夹​​。
  4. 在GDB中启动您的应用:
    $ gdb YourApp.app/Contents/MacOS/YourApp
  5. 设置打印asm-demangle并打印符号文件选项:
    set print asm-demangle on
    set print symbol-filename on
  6. 使用p / a命令查找堆栈跟踪中每个地址的行号:
    p/a 0x000000010d005483
  7. 这些说明来自this page(显然不再在线)。

    *请注意,.dSYM有一个UDID将它绑定到它创建的特定构建。所以,如果你没有原始的.dSYM文件,那你就麻烦了。从理论上讲,你甚至不能从源代码控制中提取相同的版本并重建,因为这个UDID会有所不同。