Ios 免费冲撞
我有几个来自iOS应用程序的崩溃报告,这些报告源于free()调用中的SIGABRT 调用堆栈是一致的:Ios 免费冲撞,ios,c,crash,crt,Ios,C,Crash,Crt,我有几个来自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 我试
0 libsystem_kernel.dylib 0x3863c1f0 __pthread_kill + 8
1 libsystem_c.dylib 0x385ecfdd abort + 77
2 libsystem_malloc.dylib 0x38664d67 free + 383
我试图得到更多的诊断,但在此期间,有人遇到过同样的情况吗?什么样的错误参数会使free()调用崩溃?我可以看到几个选项:
- 空指针
(实际上是合法的)
- 数据区指针(即字符串文字)
- 堆栈指针
- 垃圾指针(即未初始化的指针)
- 已释放的堆指针
“14.但我总共有10多个,那里可能有一个bug。如果我正确读取堆栈转储,代码会在
free
中触发一个断言,并调用abort
。查看上libsystem_malloc的源代码,并尝试找出哪个断言失败
你有一个迷路的指针,猜测它隐藏在哪里,以避免一次不可再现的崩溃几乎是不可能的。使用valgrind在emulator中运行应用程序(如果可能的话)可能有助于跟踪内存滥用
如果堆栈转储的长度超过3行,则应该有一个指示,说明是哪个调用
free
导致了问题。它可能有助于跟踪错误,但也可能是一些早期指针误用的后期副作用。其他值也会导致问题,很多非空指针以前没有由malloc
、calloc
或realloc
返回,或者已经由free
或realloc
释放。使用valgrind尝试定位问题。它来自用户电话,我不知道如何重现它。如果我可以复制,我就不会问这个问题:)我将首先检查您的代码并将所有C/C++指针初始化为0(NULL)。如果释放了任何内容,请将指针设置为0。检查所有执行删除(C++)或释放(C)的代码。检查您写入的任何数组,以确保您不会走到末尾。尝试释放()没有适当分配项的指针时会引发错误。很可能是未初始化的指针或已释放但未设置回0的指针,或者某个对象意外地经过并损坏了有效指针。既然你不能重新创建它,你就无能为力了。请问free()在源代码中的什么位置?是苹果内存分配器的来源。我不确定是否在iOS中使用。找到free
的源代码,如果找不到传递的指针所在的区域,您将看到它调用abort
。这稍微缩小了错误范围:它不可能是已经释放的指针,也不可能是分配数据块中的指针。NULL
检查是C标准强制执行的。调用free(NULL)
完全可以。顺便说一下,C++中的代码>删除< /代码>空指针也是可以的。