' malloc_error_break'发生在与底层内存损坏相同的线程上

时间:2013-03-08 03:06:33

标签: ios c multithreading crash malloc

我正在尝试调试iOS应用程序中的偶然崩溃。

我们得到'malloc_error_break',通常'对象在被释放后被修改'。 崩溃发生在同一个C库中,但是在不同的malloc位置。

回溯的顶部如下所示:

* thread #29: tid = 0x3a03, 0x32c8cfa8 libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 1.1
    frame #0: 0x32c8cfa8 libsystem_c.dylib`malloc_error_break
    frame #1: 0x32c71ed0 libsystem_c.dylib`szone_error + 220
    frame #2: 0x32c71f1c libsystem_c.dylib`free_list_checksum_botch + 28
    frame #3: 0x32c1d3bc libsystem_c.dylib`tiny_malloc_from_free_list + 348
    frame #4: 0x32c1c44a libsystem_c.dylib`szone_malloc_should_clear + 1274
    frame #5: 0x32c1bf1e libsystem_c.dylib`malloc_zone_malloc + 66

问题:

这是否可以保证底层内存损坏(f.i. double free等)与'malloc_zone_malloc'在相同的线程上发生?或者至少是malloc_error_break所指的内存,是在同一个线程上分配的?

肯定知道这一点,可以帮助我将崩溃与其他库,NSURLConnection请求等的影响隔离开来。应用程序非常庞大且难以调试,因为它确实如此。

修改

我想我首先想知道的是更简单的事情。

不同的线程在iOS中是否有单独的堆/ malloc列表?

1 个答案:

答案 0 :(得分:1)

无论发现什么线程,都会在发现内存损坏时立即调用

malloc_error_break()。绝对不能保证这将是哪个线程。

  

不同的线程在iOS中是否有单独的堆/ malloc列表?

没有。您的进程中的所有线程都使用一个共享堆。