代码之家  ›  专栏  ›  技术社区  ›  gonso

如何找到malloc“double free”错误的原因?

  •  84
  • gonso  · 技术社区  · 16 年前

    MyApp(2121,0xb0185000)malloc:***对象0x1068310的错误:双自由
    ***在malloc_error_break中设置断点进行调试

    当我发布一个NSAutoreleasePool时,我无法弄清楚我要发布两次的对象是什么。

    我该如何设置他的断点?

    13 回复  |  直到 8 年前
        1
  •  47
  •   Community Mohan Dere    8 年前

    我发现追踪额外版本的最佳方法是使用 NSZombie已启用 Xcode中受影响的可执行文件的环境变量。要快速了解如何使用它,请查看 this CocoaDev wiki page (除了这个页面,苹果公司还记录了一些在Xcode中调试代码的令人难以置信的晦涩但有用的技巧,其中一些技巧已经帮了我很多次。我建议查看一下 this Technical Note developer.apple.com上的链接跳转到Cocoa的Foundation框架部分)。

    编辑: 你通常可以在Xcode调试器中跟踪违规对象,但如果你使用Instruments来帮助你,通常会容易得多。从Xcode中,选择 Run → 从性能工具开始→ 对象分配

    还有一个 related SO question here .

        2
  •  39
  •   Hemang    12 年前

    1. ALT - 命令 - )
    2. 滚动到列表底部并添加符号 malloc_error_break
        3
  •  13
  •   Hoang Pham    15 年前

    除了奎恩·泰勒的回答,我只想补充一下我的经验。

    我尝试了奎因在回答中建议的所有方法,但仍然无法找出确切的原因。

    我将NSZombieEnabled=YES,NSStackLogging=YES,运行命令shell malloc_history来找出原因,但仍然没有成功。它总是指出我将数据保存到核心数据对象中的位置,事实上,我已经检查了那里的过度发布的对象数千次,没有什么奇怪的。

    最后的救援:我试图回到从核心数据中提取对象的视图,并向所有这些对象发送保留消息,并注意到这些更改。它解决了问题!!!

    所以,我发现我没能留住一个,这正是原因所在。只是想分享我的经验,这样你的应用程序就有了另一个拯救。

        4
  •  11
  •   Adam Rosenfield    16 年前

    break malloc_error_break
    

    malloc_error_break 功能。

    print-object 0x1068310
    

        5
  •  8
  •   Ramkrishna Sharma    8 年前


    1) 点击“ ".
    " +
    3) 添加“
    4) 添加 " 符号 “选项。

    GIF represenation

        6
  •  4
  •   c-alpha    14 年前

    (gdb) call (void)_CFAutoreleasePoolPrintPools()
    

    就在坠机之后。堆栈顶部的地址是罪犯的地址 retain 瞧。

        7
  •  4
  •   Old McStopher    13 年前

    在Xcode 4中添加符号断点

    只是一个更新,使其与Xcode 4相关。。。

    Xcode 4 User Guide :

    添加符号断点。 . .

    1. 按钮。
    2. 在中输入符号名称 符号字段。
    3. 单击“完成”。
        8
  •  3
  •   Martijn Thé    16 年前

    这就是Xcode中Breakpoints窗口中malloc_error_break断点的样子。 需要勾选复选框才能使其工作。

    alt text http://www.martijnthe.nl/wp-content/uploads/2009/08/Afbeelding-1.png

        9
  •  2
  •   Hemang    12 年前

    [super dealloc].

    我也遇到了同样的问题,发现我在打电话 [self dealloc] 相反。只是不注意。

        10
  •  0
  •   Benny Wong    16 年前

    建议不要让您创建的对象 autorelease 因为内存在iPhone上是一种商品。苹果建议明确致电 release .

        11
  •  0
  •   Jared Oberhaus    16 年前

    为了发现这类内存和指针问题,您需要在运行时内存错误检查器上运行代码,例如 Valgrind

    瓦尔格兰德 can work on OSX (尽管它说它“不受支持、不完整、有缺陷”),经过一点黑客攻击,有人让它开始工作 iPhone SDK executables .

    更好的是,你可以尝试乐器,这是XCode的一部分。有一个运行它的教程 here .

        12
  •  0
  •   Hemang    12 年前

    如果 malloc_error_break 没有帮助。..

    解决此错误的最佳方法是运行 仪器 随着 NSZombies 打开。当僵尸消息发出时,仪器会标记你,你可以直接追溯到代码行。

        13
  •  0
  •   Community Mohan Dere    8 年前

    post post question .

    删除“自动显示Web”选项。…,将消除此问题。

    如果这不起作用,请参阅此 answer post 调试它。

    deselect automatically inspect on safari preview