释放对象的校验和不正确。在应用程序上非常奇怪的崩溃

时间:2012-01-17 20:13:19

标签: iphone objective-c ios xcode ipad

我已经在应用程序上工作了一段时间..直到现在我一直在运行它,而调试器已经附加并且运行良好(因为NSZombies已启用)...

我最近注意到,当推送到新的视图控制器时,应用程序会崩溃。我认为这将是一个简单的修复,但到目前为止它看起来并不那样。

该应用程序通过执行以下操作(此方法以前有效)...

  1. 用户选择查看
  2. RootViewController推送到tableViewController
  3. 用户选择项目
  4. ViewController初始化和配置
  5. 导航控制器推送到新的ViewController
  6. 现在,如果我配置我的方案以启用NSZombies,那么这很好..我的新视图加载和挥动,它的工作原理。

    然而..如果我没有应用程序崩溃!

    在我的控制台窗口中,出现以下错误:

    2012-01-17 19:51:14.599 DrivingInstructor[61946:17003] -[PhotoViewController loadView]
    2012-01-17 19:51:14.654 DrivingInstructor[61946:17003] -[PhotoViewController viewWillAppear:]
    DrivingInstructor(61946,0xac6ad2c0) malloc: *** error for object 0x92b0e14: incorrect checksum for freed object - object was probably modified after being freed.
    *** set a breakpoint in malloc_error_break to debug
    

    所以我设置了malloc_error_break以查看发生了什么......没有任何区别,我仍然得到上述错误(请注意前两条消息显示我的新ViewController正在初始化)

    如果我在崩溃后运行了一个回溯..这是我的输出:

    #0  0x956a9c97 in malloc_error_break ()
    #1  0x9566b4ce in szone_error ()
    #2  0x9566b54e in free_list_checksum_botch ()
    #3  0x9566b63f in tiny_free_list_remove_ptr ()
    #4  0x956702b1 in szone_free ()
    #5  0x01f30a98 in __CFAllocatorSystemDeallocate ()
    #6  0x01f2978a in CFAllocatorDeallocate ()
    #7  0x01f30960 in CFRelease ()
    #8  0x01fe6b4f in __CFDictionaryStandardReleaseKey ()
    #9  0x01f474df in __CFBasicHashDrain ()
    #10 0x01f304e3 in CFRelease ()
    #11 0x02011e94 in -[__NSArrayM dealloc] ()
    #12 0x021c8e4d in _objc_rootRelease ()
    #13 0x021c8e10 in objc_release ()
    #14 0x021c9c60 in (anonymous namespace)::AutoreleasePoolPage::pop ()
    #15 0x01f58ed8 in _CFAutoreleasePoolPop ()
    #16 0x015f08ce in __NSFireDelayedPerform ()
    #17 0x01ff8966 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ ()
    #18 0x01ff8407 in __CFRunLoopDoTimer ()
    #19 0x01f5b7c0 in __CFRunLoopRun ()
    #20 0x01f5adb4 in CFRunLoopRunSpecific ()
    #21 0x01f5accb in CFRunLoopRunInMode ()
    #22 0x023e2879 in GSEventRunModal ()
    #23 0x023e293e in GSEventRun ()
    #24 0x00cd8a9b in UIApplicationMain ()
    #25 0x00002149 in main (argc=1, argv=0xbffff5d4) at main.m:14
    

    我还应该指出......我原本以为这是由于我运行后台线程导致的,当ui加载时为我调整图像大小,所以没有冻结,因为我的第一个崩溃日志表明它崩溃了在我的图像处理类中的某一行,但在无法对其进行排序并注释掉函数后调整图像大小(在后台线程上运行)..现在应用程序崩溃了,我甚至没有调用该线程!

    我不知道发生了什么事情就像我最初的崩溃日志那样告诉我在崩溃发生时使用UIGraphics在后台线程上的问题......

    现在它崩溃了:S

    以下是我的崩溃日志:

    (当我超过3k字符限制时,pastebin) http://pastebin.com/dGF7QdeH

    我会将代码分享给发生此问题的应用,但我不知道它发生在哪里,所以我无法告诉你:S

    从我所看到的,viewWillAppear:函数被调用,所以我可以设置我的视图,但它在我实际推送之前崩溃但是在视图的设置中没有任何异常,因为我改变了唯一的代码因为最后一个工作版本正在设置我的视图(运行正常)

    如果有人可以帮助我,我将非常感激......我一整天都在强调这一点,在这里张贴是我最后的选择(在我去developer.apple.com之前)

    感谢您阅读,如果您需要更多信息,请与我们联系。

    利安

5 个答案:

答案 0 :(得分:3)

首先,找出什么对象是0x92b0e14。 (或调试器中显示的任何地址。)一旦知道它是什么对象,然后在释放它的任何地方放置断点,并在出现错误的位置放置断点。当您在遇到错误之前点击发布时,您会看到问题所在。

可能是您永远不会保留此对象,如果在自动释放后更改了该对象,则可能会产生相同的结果。在这种情况下,实现一个保留/释放方案,使该对象保持活动状态,直到完成它为止。

答案 1 :(得分:1)

你在主线程上冲了一些东西,后台线程先用它来绊倒它。

当其他所有方法都失败时,您可以使用二进制搜索来查找问题。创建一个新的#define,如SEARCH_BUG = 1,然后使用#ifdef SEARCH_BUG注释掉大量代码区域。离开僵尸并启用涂鸦,其他一切也可能比没有它时更快地发现错误。

这是一款iPhone应用程序,在模拟器中运行,在硬件上运行 - iPad - 等也许这个问题会在真实硬件或模拟器中早期出现。

答案 2 :(得分:0)

该堆确定看起来像是过度释放。 (如果确实有僵尸检测,那么这种情况就不太可能了。)

答案 3 :(得分:0)

我不知道这是否有用,但是我遇到malloc错误的次数很少,我的视图控制器层次结构中无意中存在同一个视图控制器类的两个实例。尝试将NSLog(@"init: %@", self);放在init()中的视图控制器NSLog(@"dealloc: %@", self);dealloc()中,然后比较类名称和实例地址。

答案 4 :(得分:0)

我在Apple开源上找到了函数free_list_checksum_botch()。

https://opensource.apple.com/source/Libc/Libc-825.26/gen/magazine_malloc.c

它尝试将错误日志和#34;错误的校验和放在被释放的对象上 - 对象可能在被释放后被修改。"