【问题标题】:malloc: *** error: incorrect checksum for freed object - object was probably modified after being freedmalloc: *** 错误: 已释放对象的校验和不正确 - 对象可能在被释放后被修改
【发布时间】:2013-11-19 09:03:50
【问题描述】:

我的 iOS 应用程序有一个大问题:它有时会在没有详细调试错误的情况下崩溃。 堆栈跟踪为空。这些是堆栈跟踪中仅有的两行:

  1. 在 UIApplicationMain 中的“符号存根:-[_UIHostedTextServiceSessiondismissTextServiceAnimated:]”处开始崩溃。
  2. 并报告“libsystem_c.dylib`malloc_error_break”。

com.apple.main-thread.

Xcode 调试器上的错误(连接设备):

malloc: *** error for object 0x208a7614: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

我已经使用 libsystem_c.dylib 在 malloc_error_break 中设置了一个断点,而没有来自调试器的任何反馈。我不知道如何解决这个问题。

【问题讨论】:

  • 这很难。您基本上必须检查代码才能发现问题。如果您能弄清楚所涉及的对象类型,那将有很大帮助。 (顺便说一句,ARC 还是手动引用计数?)
  • 我很确定在malloc_error_break 中设置断点的唯一用途是它可以让您有机会查看损坏的释放对象,并且内存的内容可能会对您有所帮助追踪你覆盖它的点。
  • 这是一个 C++ 库,它是 MRC 项目。
  • 我的朋友在 Mac 上编译了我的 C 代码,它在运行时给出了这个错误。但是,它在 Linux 上编译并运行得很好。这似乎是 Mac 特有的问题。
  • 尝试清理项目 CMD+SHIFT+K。它有帮助:)

标签: ios objective-c c crash malloc


【解决方案1】:

要找到问题的根源,在 Xcode 中转到 Product > Scheme > Edit Scheme,然后在 Diagnostics 选项卡下启用所有 Malloc 设置和 Guard Malloc。

这样,再次运行您的应用程序,Xcode 将停在导致问题的行。

【讨论】:

  • 值得指出的是,Guard Malloc 只能在模拟器中使用,不能在真实设备上使用。见:developer.apple.com/library/ios/documentation/Performance/…
  • dyld:无法加载插入的库“/usr/lib/libgmalloc.dylib”,因为找不到图像
  • Enable Guard Malloc 对我有用,尽管值得注意的是它似乎显着减慢了模拟器的速度,因此我只会在调试实际问题时打开它。
  • 我正在使用 macOS Big Sur 11.1,Xcode 12.3,当我尝试 Xcode 时,产品 > 方案 > 编辑方案,没有任何反应,我尝试了几次,甚至重新启动然后再次尝试,再次相同,什么都没有发生。
【解决方案2】:

既然您在调试器中,您应该查看内存位置0x208a7614 并查看那里有什么。内存中的数据可能有助于找出问题所在。

发生的情况是以下之一:

  1. 你正在释放一个对象两次,

  2. 你正在释放一个从未分配过的指针

  3. 您正在通过一个无效指针写入,该指针先前指向一个已被释放的对象

由于堆栈跟踪是空的,因此在代码的各个位置添加一些调试日志语句可能会很有用,以查看是否可以缩小代码中问题所在的范围。使用 Instruments 中的记忆工具也可能会有所帮助。您可以尝试打开 NSZombies,但这看起来像是 C 分配问题,而不是 Objective-C 问题。

另外,在崩溃之前还有其他内容写入控制台吗?如果是这样,它可能会指出问题出在哪里。

【讨论】:

  • 错误消息提示了第三种可能性:OP 正在通过一个无效指针写入,该指针先前指向一个已被释放的对象。
  • 啊,好点子。我以为错误是在调用free() 时显示的,但它是在调用malloc() 时显示的。接得好。我将更新文本以反映这一点。
  • 第四个可能的原因:将已分配块的末尾写入另一个当前未分配的块。
  • 如果僵尸没有抓到任何东西,那么 Guard Malloc 可能会提供帮助。
  • 这个答案在我的 C 程序中拯救了我。我不小心分配了太小的数组,无法在我的代码中的其他地方保存 sprintf 结果。检查内存地址可以准确地告诉我哪个是有问题的字符串,因为我能够识别它的内容。
【解决方案3】:

大家好,如果您使用的是 nib 或 xib 界面,并且当您想要推送 viewcontroller 对象时遇到此问题,那么我已经找到了此解决方案,那么有时会发生此错误并且您的应用程序将崩溃(特别是 iPad 中的错误)这是解决方案:

// 格式如下

UINavigationController *nav=[[UINavigationController      alloc]initWithRootViewController:yourViewControllerObj];

[self.navigationController  presentViewController:nav animated:true completion:nil];

在这种情况下不要试图推动。

【讨论】:

    【解决方案4】:

    如果你有这个问题。 进入:产品->方案->诊断-> 然后启用 mollic gaurd edgezombie object 然后关闭 然后去产品->停止 然后再一次 产品构建和运行。 祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 2012-03-17
      相关资源
      最近更新 更多