OS X中的64位版本 - 不一致的malloc错误

时间:2013-01-13 22:42:41

标签: xcode macos 64-bit malloc 32bit-64bit

我在Xcode中遇到了一个非常不一致的错误:

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

我知道这不是我的代码,因为32位构建工作得很好(架构设置为标准32/64,而构建活动架构仅设置为否)。它偶尔会工作得很好而不会改变评论,但只有大约10%的时间。

我使用断点跟踪错误,有时它发生在类似于:myClass = new MyClass的ivar上,但有时它会在删除不相关的ivar时发生。我已经尝试在创建新实例之前将myClass设置为null但这没有帮助,而且我不知所措,因为我不完全理解缓存,寄存器,堆和堆栈(这可能会让我们深入了解原因这种情况正在发生。)

以下是我收到错误的地方的一些代码。请注意,每组代码行都是一个不同的地方,而类,可能会或可能不会发生错误。

错误1

void functionA() {
    // bunch of unrelated code
    if (aAinterpFilter)
        delete aAinterpFilter;

    // this is where the first error sometimes happens
    aAinterpFilter = new InterpFilter((Window::Sinc::LP*)filterDesign, aAinterpFactor);
}

错误2

Window::Sinc::LP::~LP ()
{
    // the z delete is where the error sometimes happens
    delete[] z;
    delete[] kernel;
}

错误3

void AAOsc :: setPhase(double phase) {
    if (phase < 0.0) phase = 0.0;
    if (phase > 1.0) phase = 1.0;

    // this is where the error rarely happens, but it does sometimes.
    osc->tickInfo->curvPhase = static_cast<uint>(phase * 4294967296.0);
}

任何可能指向解决方案的想法都将受到高度赞赏。

GW

1 个答案:

答案 0 :(得分:0)

您需要在建议的函数malloc_error_break()上添加断点。运行应用程序,让调试器中断该功能。退回一两个堆栈框架,您将看到操作系统认为已经修改了哪个变量。然后,您需要确定该变量之前可能已被释放的位置。

如果您有malloc编辑然后写入的内存块,并且在malloc返回的指针之前意外写了几个字节,也会发生这种情况。 。你可以通过打开guard malloc并再次发生它来捕获它。