崩溃日志缺少一个符号帧

Posted

技术标签:

【中文标题】崩溃日志缺少一个符号帧【英文标题】:Crash log is missing one symbolicated frame 【发布时间】:2013-02-26 11:59:17 【问题描述】:

我只在一个崩溃日志中注意到了这个问题,我无法完全理解为什么会发生这种情况。基本上,我已经对来自客户的崩溃日志进行了符号化,所有这些都检查出来并正确地符号化,除了一帧,它仍然是未符号化的。下面是一个 sn-p(第 9 帧是问题):

6          libc++abi.dylib      0x00001114 std::terminate() + 20
7          libc++abi.dylib      0x00002513 __cxa_throw + 123
8          libstdc++.6.dylib      0x00005ba9 std::__throw_out_of_range(char const*) + 153
9          MyApp      0x002ff343  0x0000c000 + 3093315
10         MyApp      0x002ec02b -[ChildViewController tableView:cellForRowAtIndexPath:] (ChildViewController.mm:42)
11         MyApp      0x0042d725 -[ViewControllerRoot tableView:cellForRowAtIndexPath:] (ViewControllerRoot.m:198)
12         UIKit      0x0004e54d -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 413

我尝试了各种方法来符号化这条线,但无济于事。我已经手动运行了 atos 以及 symbolicatecrash.pl (详细了解发生了什么)。 dSYM 和 .app 文件很好,并且与崩溃日志的二进制图像部分中的应用程序的 UUID 匹配。我使用的是最新的稳定版 Xcode,4.6。其他团队成员也尝试过,结果相同。

这里有什么问题吗,或者这是 Objective-C 的动态特性的问题?我相信是前者,但 MyApp 中的其他框架/符号被符号化的事实让我更加困惑!

更新:我应该澄清一下,似乎可以很容易地推断出丢失的帧,但是此时对许多不同的类进行了多次调用,这都可能引发@987654322 @ 错误。因此,这个缺失的帧使调试变得更加困难。

【问题讨论】:

【参考方案1】:

这可能是被调用的第 3 方代码吗?一些第 3 方静态库不包含符号。

另一种可能性是,此代码是通过使用 Xcode 子项目生成的静态库集成的。并且这个项目被设置为从静态库中去除符号。

这两种方法都将导致这些调用的崩溃报告中不会出现任何符号。

【讨论】:

很遗憾,堆栈的这个框架内没有使用任何静态库。 使用 atos 手动进行符号化时,您是否按照此处发布的规则将正确的地址传递给 atos? ***.com/questions/13574933/… 是的,我从atos -arch armv7 -o MyApp.app.dSYM/Contents/Resources/DWARF/MyApp 0x002F4343 得到的输出是0x002f4343 (in MyApp)。没有符号信息... 如果不排除项目本身和 dSYM 以及其他情况,我怀疑是否有可能找出符号中缺少此框架的原因。

以上是关于崩溃日志缺少一个符号帧的主要内容,如果未能解决你的问题,请参考以下文章

iOS 查看崩溃日志与符号化

隐藏动态框架的符号化崩溃日志

在 Xcode 4.2 中启用崩溃日志符号化

OS X 崩溃日志符号化

iOS 符号化崩溃日志

iOS系统app崩溃日志手动符号化