【问题标题】:iPhone: understanding field crash reports: unrecognized selector?iPhone:了解字段崩溃报告:无法识别的选择器?
【发布时间】:2010-05-05 05:23:44
【问题描述】:

在现场使用我的应用程序的用户似乎遇到了严重的应用程序启动崩溃问题。我让他从他的 PC 上向我发送 .crash 文件。在根据this article“符号化”它们之后,我从堆栈中得到看起来像一个无法识别的选择器失败的东西。但是与我的进程相对应的第一行代码是一个明确的消息发送,它在我的应用程序中正常执行数百次而没有问题。不用说,我自己从不重复这个问题。

崩溃报告会撒谎吗?除了无法识别的选择器之外,这个堆栈还能指示任何东西吗?感谢您提供任何见解。

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Thread 0 Crashed:
0   libSystem.B.dylib               0x000790a0 __kill + 8
1   libSystem.B.dylib               0x00079090 kill + 4
2   libSystem.B.dylib               0x00079082 raise + 10
3   libSystem.B.dylib               0x0008d20a abort + 50
4   libstdc++.6.dylib               0x00044a1c __gnu_cxx::__verbose_terminate_handler() + 376
5   libobjc.A.dylib                 0x000057c4 _objc_terminate + 104
6   libstdc++.6.dylib               0x00042dee __cxxabiv1::__terminate(void (*)()) + 46
7   libstdc++.6.dylib               0x00042e42 std::terminate() + 10
8   libstdc++.6.dylib               0x00042f12 __cxa_throw + 78
9   libobjc.A.dylib                 0x000046a4 objc_exception_throw + 64
10  CoreFoundation                  0x00094174 -[NSObject doesNotRecognizeSelector:] + 108
11  CoreFoundation                  0x00093afa ___forwarding___ + 482
12  CoreFoundation                  0x000306c8 _CF_forwarding_prep_0 + 40
13  MyAppProcess                    0x000147c6 -[ImageLoader imageSmallForColor:style:] (ImageLoader.m:180)
.... /* many more frames... */

【问题讨论】:

  • 用户手机运行的是什么版本的操作系统?您是否尝试调用在更高版本中添加的 API?
  • 操作系统版本在这里不是问题。谢谢。

标签: iphone objective-c debugging crash


【解决方案1】:

“无法识别的选择器”也可以表示“过度释放的对象”。假设您有一个对象 x,并且它被不正确地释放。该内存位置现在可以免费用于其他用途。假设它被用于 Y 类的某些东西。现在,下次您尝试向 x 发送消息时,您将收到一条关于 Y 类如何不响应选择器的消息。

【讨论】:

  • 有趣的想法。谢谢你的想法。
【解决方案2】:

符号化可能会失败,但不太可能——如果失败,您更有可能根本看不到任何符号。

崩溃日志坚持 ImageLoader.m:180 正在尝试向对象发送无效消息。这可能是对的,即使情况很奇怪。

我的建议:让看到崩溃的人从 Console.app 向您发送 NSException 错误的副本。这将告诉您接收消息的对象的类和消息的选择器。

可能性 1:用户正在运行与您不同的操作系统版本,并且选择器在他的操作系统版本上不存在。或者类似地,他的构建中的文件已过期并且缺少选择器。

可能性 2:但是您正在创建/获取对象在用户的计算机上具有不同的结果。例如你总是得到一个 NSString,但用户得到一个 NSNumber。

【讨论】:

  • 谢谢马特。您能否详细说明获取 NSException 信息? iPhone 用户是否会因崩溃而在其 Console.app 中获取内容?--我自己找不到。仅供参考,喜欢你的博客。
  • 抱歉,我忽略了 iPhone 标签;不,您可能无法获取控制台信息(这是您只能对 Mac 应用执行的操作)。
猜你喜欢
  • 2016-07-05
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多