我有一个来自iOS应用的崩溃报告,这些崩溃报告源于free()调用中的SIGABRT。

调用堆栈是一致的:

0   libsystem_kernel.dylib              0x3863c1f0 __pthread_kill + 8
1   libsystem_c.dylib                   0x385ecfdd abort + 77
2   libsystem_malloc.dylib              0x38664d67 free + 383

我正在尝试获取更多诊断信息,但与此同时,有人遇到过同样的情况吗?哪种错误的论点会使free()调用崩溃?我可以看到几个选项:
  • 空指针(actually legit)
  • 数据区域指针(即字符串文字)
  • 堆栈指针
  • 垃圾指针(即未初始化的指针)
  • 已经释放的堆指针

  • 有什么想法吗?那些是非常罕见的,最后一个是在9月
    '14。但是我总共有10多个,那里可能有一个错误。

    最佳答案

    如果我正确读取了堆栈转储,则代码会触发free的断言,并称为abort。查看http://opensource.apple.com上libsystem_malloc的源代码,然后尝试确定哪个断言失败。

    您有一个流浪指针,猜测它在单个不可复制的崩溃中隐藏的位置几乎是不可能的。使用valgrind在模拟器中运行您的应用程序(如果可能)可能有助于您跟踪内存滥用情况。

    如果堆栈转储的时间长于3行,则应指出哪个对free的调用引起了问题。它可以帮助您跟踪该错误,但也可能是某些较早的指针误用的较晚的副作用。

    10-04 17:37
    查看更多