为什么应用程序会因_objc_msgSend_uncached而崩溃

时间:2013-12-05 18:26:48

标签: ios crash-dumps

是否有文档或地点可以查找有关在崩溃报告中导致_objc_msgSend_uncached的信息的信息?

关于崩溃的更多信息

libobjc.A.dylib 0x37e623cc  _objc_inform
4   libobjc.A.dylib 0x37e616f2  _ZN7cache_t9bad_cacheEP11objc_objectP13objc_selectorP10objc_class
5   libobjc.A.dylib 0x37e61730  _ZN7cache_t4findEm
6   libobjc.A.dylib 0x37e617da  cache_fill
7   libobjc.A.dylib 0x37e65890  lookUpImpOrForward
8   libobjc.A.dylib 0x37e5e02a  _class_lookupMethodAndLoadCache3
9   libobjc.A.dylib 0x37e5ddf8  _objc_msgSend_uncached
10  MyApp   0x00253f5c  -[AEEngine scanKeyframes:currentFrame:] in AEEngine.m on Line 256
11  MyApp   0x00256148  -[AEEngine doFrame] in AEEngine.m on Line 664
12  MyApp   0x00255f28  __31-[AEEngine doFrameInBackground]_block_invoke in AEEngine.m on Line 642

得到了另一个类似的崩溃,看起来像这样,并以cache_t :: bad_cache

结束
  0   libobjc.A.dylib                   0x37b44368 _objc_trap() + 0
  1   libobjc.A.dylib                   0x37b443c8 _objc_fatal + 68
  2   libobjc.A.dylib                   0x37b436ee cache_t::bad_cache(objc_object*, objc_selector*, objc_class*) + 202
  3   libobjc.A.dylib                   0x37b4372c cache_t::find(unsigned long) + 48
  4   libobjc.A.dylib                   0x37b437d6 cache_fill + 122
  5   libobjc.A.dylib                   0x37b4788c lookUpImpOrForward + 320
  6   libobjc.A.dylib                   0x37b40026 _class_lookupMethodAndLoadCache3 + 30
  7   libobjc.A.dylib                   0x37b3fdf6 _objc_msgSend_uncached + 22
  8   MyApp                         0x0033811c -[MyCellCell configureCell:] (MyCellCell.m:81)

4 个答案:

答案 0 :(得分:11)

_objc_msgSend_uncachedobjc_msgSend的内部实施细节。 objc_msgSend中的崩溃最常表明您正在向已解除分配的实例发送消息。最常见的原因是不正确的内存管理。导致内存管理不正确的最常见原因是无法使用ARC。

最有可能的是,-[AEEngine scanKeyframes:currentFrame:]正在尝试发送已解除分配的内容。这并不意味着错误在AEEngine中,只是这是你在过度释放时绊倒的地方。我首先要确保ARC已打开,并且您已解决所有静态分析器警告。

答案 1 :(得分:1)

这不完全是文档,但发现了这个

http://opensource.apple.com/source/objc4/objc4-551.1/runtime/Messengers.subproj/objc-msg-x86_64.s

/********************************************************************
 *
 * _objc_msgSend_uncached_impcache
 * _objc_msgSend_uncached
 * _objc_msgSend_stret_uncached
 * 
 * Used to erase method cache entries in-place by 
 * bouncing them to the uncached lookup.
 *
 ********************************************************************/

    STATIC_ENTRY __objc_msgSend_uncached_impcache
    // Method cache version

    // THIS IS NOT A CALLABLE C FUNCTION
    // Out-of-band condition register is NE for stret, EQ otherwise.
    // Out-of-band r11 is the searched class

    MESSENGER_START
    nop
    MESSENGER_END_SLOW

    jne __objc_msgSend_stret_uncached
    jmp __objc_msgSend_uncached

    END_ENTRY __objc_msgSend_uncached_impcache


    STATIC_ENTRY __objc_msgSend_uncached
    DW_START __objc_msgSend_uncached

    // THIS IS NOT A CALLABLE C FUNCTION
    // Out-of-band r11 is the searched class

    // r11 is already the class to search
    MethodTableLookup %a1, %a2, __objc_msgSend_uncached // r11 = IMP
    cmp %r11, %r11      // set eq (nonstret) for forwarding
    jmp *%r11           // goto *imp

    DW_END __objc_msgSend_uncached, 1
    END_ENTRY __objc_msgSend_uncached


    STATIC_ENTRY __objc_msgSend_stret_uncached
    DW_START __objc_msgSend_stret_uncached
    // THIS IS NOT A CALLABLE C FUNCTION
    // Out-of-band r11 is the searched class

    // r11 is already the class to search
    MethodTableLookup %a2, %a3, __objc_msgSend_stret_uncached  // r11 = IMP
    test    %r11, %r11      // set ne (stret) for forward; r11!=0
    jmp *%r11           // goto *imp

    DW_END __objc_msgSend_stret_uncached, 1
    END_ENTRY __objc_msgSend_stret_uncached

答案 2 :(得分:0)

_objc_msgSend_uncached是由于内存访问错误。如果您的Xcode版本高于 7.0 ,则可以使用 Edit Scheme (编辑方案)中的Address Sanitizer查找内存访问错误。

检查堆栈中的错误位置。

然后更正错误。

答案 3 :(得分:-2)

使用其他音频引擎修复了此错误。旧的音频引擎中有vDSP功能,虽然我不知道原因,我怀疑由于vDSP功能使用不当导致某种形式的对齐或内存损坏。