【问题标题】:Does 'malloc_error_break' occurs on the same thread as the underlying memory corruption'malloc_error_break' 是否发生在与底层内存损坏相同的线程上
【发布时间】:2013-02-23 12:38:09
【问题描述】:

我正在尝试调试我们的 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

问题:

这是否保证底层内存损坏(例如双重释放等)发生在与“malloc_zone_malloc”相同的线程上?或者至少 malloc_error_break 所指的内存是在同一个线程上分配的?

肯定地知道这一点,将帮助我将崩溃与其他库、NSURLConnection 请求等的影响隔离开来。该应用程序相当大,而且调试起来也很困难,因为它是。

编辑:

我想我首先也想知道一些更简单的东西。

iOS 中不同的线程有不同的堆/malloc 列表吗?

【问题讨论】:

  • iOS 中不同的线程有单独的堆/malloc 列表吗? -- 不是堆 -- 每个核心一个列表(至少,在 osx 实现中)。
  • 我已经找到了这个想法的来源:cocoawithlove.com/2010/05/look-at-how-malloc-works-on-mac.html。虽然它仅指 Mac OS,但博客明确指出“微小”分配列表对于不同的线程是分开的?我弄错了吗?

标签: ios c multithreading crash malloc


【解决方案1】:

malloc_error_break() 在发现内存损坏后立即调用,无论是哪个线程发现它。绝对不能保证这将是哪个线程。

iOS 中不同的线程有不同的堆/malloc 列表吗?

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

【讨论】:

  • 请提供更多理由。同时,我已经更新了问题,请看一下。
  • @lukasz 答案是正确的 +1。系统重用某些分配。它在返回时标记免费分配(例如freed)。当重用实现访问它提供的分配时,它可能会执行完整性检查(不一定总是穷举)。在双重释放的情况下,消息/错误发生在同一个线程上。在释放后进行修改(您的问题)的情况下,重用实现不知道哪个线程写了释放的内存——它在事后告诉您。 guard malloc 使得这个类中的大部分错误很容易重现。
  • 为您的简单问题添加了一个简单的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多