【问题标题】:Nvwa leak detection library crashes on iOSNvwa 泄漏检测库在 iOS 上崩溃
【发布时间】:2014-12-26 15:43:42
【问题描述】:

Nvwa 在其删除运算符覆盖中的免费调用时崩溃,尤其是在模拟器上,并出现错误:
malloc: *** error for object [hexadecimal address]: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug

【问题讨论】:

    标签: ios xcode memory-leak-detector


    【解决方案1】:

    您的泄漏检测库显然有一个堆损坏错误,可能是释放后使用。我建议您使用 Instruments 或 malloc 历史记录来确定该地址先前对应的内容,然后审核该分配的生命周期和指向它的指针。

    【讨论】:

    • 如果是这样,那么为什么要启用线程支持来修复崩溃?纯属运气?是的,禁用线程同步的最终结果是一样的,堆损坏。
    • 好吧,您的建议虽然很笼统,但可能会有所帮助。我已经用出了什么问题的例子更新了我的答案。
    【解决方案2】:

    这一切都与您用于构建库的目标上的编译设置有关。

    Nvwa 使用特定于平台的宏来识别可用的线程库,而 _PTHREADS 通常不会在 iOS 上定义,而我通过未将 NVWA_USE_CXX11_MUTEX 设置为 1 来不允许 C++11 互斥锁。所以我们几乎没有其他选择,要么定义 _PTHREADS,允许使用 C++11 互斥锁,要么更改 Nvwa 代码以检查 _POSIX_THREADS 宏...

    绝对需要“正确”互斥锁的地方之一是更新分配列表,用于报告泄漏(在 debug_new.cpp 中)。如果不在那里同步,下一个元素指针必然最终指向已释放的内存,并且释放后使用只是时间问题。

    【讨论】:

    • 附带说明,遗憾的是 NVWA 文档几乎不存在。如果他们至少包含一个 makefile 或其他东西,这可以让我深入了解可能的选项,我就不必浏览他们的代码。另一个缺点是 NVWA 在 iOS 上报告误报,因为第三方库具有“静态”缓存方案(这种泄漏检测方法的一般问题,在 Visual Studio 下的 CRTDBG 也会发生同样的事情),但这在这里是题外话。 ..
    猜你喜欢
    • 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
    相关资源
    最近更新 更多