【问题标题】:iPhone - debugging "pointer being freed was not allocated" errorsiPhone - 调试“未分配指针”错误
【发布时间】:2008-11-17 15:04:45
【问题描述】:

过度释放指针时,您可能会看到诸如

之类的错误

“被释放的指针未被分配”

在使用模拟器进行调试时,我添加了一个构建参数 MallocStackLogging = YES - 这允许我在终端中使用 malloc_history 来追踪我过度释放指针的位置。

如果我使用此构建参数在设备上进行调试,我会收到各种控制台错误“无法创建堆栈日志文件”等。

奇怪的是,我在设备上出现了一些过度释放的指针错误,但在模拟器上却没有。

有没有人有使用设备本身追踪这些的经验?

谢谢!

【问题讨论】:

    标签: iphone cocoa-touch malloc-history


    【解决方案1】:

    另一种方法。确保打开 NSZombie,以便它报告正在获得额外释放的对象的内存地址。然后使用性能工具-> 对象分配运行。这将带来乐器。查看 Xcode 管理器提供的控制台日志。一旦你得到崩溃查找仪器中的内存地址。您将看到该对象上 malloc/frees 的全部历史记录,以及直接进入您的代码的链接。

    【讨论】:

    • 我无法通过这些确切的方向得到它(在 Xcode 4.2.1 中) - 我必须通过 Xcode 运行,然后在运行时附加 Instruments。我为我当前的方案打开了“启用僵尸对象”,一旦我触发了异常,Instruments 就会像冠军一样锁定并将我带到僵尸地址的历史记录中。我查看了初始分配的堆栈跟踪,并看到了导致异常的不必要的[autorelease]。很棒的工具!
    • 完整的“操作方法”显示在 2010 年的 WWDC 视频中,名为“Session 311 - Advanced Memory Analysis With Instruments”,时间为 31:50。
    【解决方案2】:

    我一般用 NSZombie 来做这些事情,检查this out

    【讨论】:

      【解决方案3】:

      您需要在目标可执行文件上设置 MallocStackLogging 环境变量...

      要访问这些设置,请从 XCode 的 Groups & Files 窗格中选择您的可执行文件,然后选择 Get Info。

      转到“参数”选项卡并将以下条目添加到“要在环境中设置的变量”框中:

      【讨论】:

        【解决方案4】:

        请测试程序是否有内存泄漏,还要检查自动释放以及是否正确释放对象。此外,我们需要检查释放的对象是否分配了内存。您还需要注意自动释放​​,因为不小心我们可能会释放一个数组或一个字符串或任何已经自动释放的对象...希望它有所帮助和工作!

        提示:您可以通过分析项目来测试泄漏(点击 shift+command+k)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-02
          • 2013-10-12
          • 2016-01-08
          • 2014-10-09
          • 2023-03-29
          • 2014-06-07
          相关资源
          最近更新 更多