У меня есть несколько отчетов о сбоях от приложения iOS, которое происходит из SIGABRT в вызове free().Crash in free()
Стек вызовов соответствуют:
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)
- указатель области данных (то есть строковый литерал)
- стек указатель
- указатель мусора (т.е. неинициализированная один)
- указатель кучи, который уже был освобожден
Любые идеи, пожалуйста? Это довольно редко, последний был в сентябре '14. Но у меня более 10 баллов, вероятно, там есть ошибка.
Другие значения также вызовут проблемы, очень любой указатель не-NULL, который ранее не возвращался 'malloc',' calloc' или 'realloc' или уже был свободен' free' или 'realloc'. Используйте valgrind, чтобы попытаться найти проблему. – chqrlie
Он пришел из пользовательских телефонов, я понятия не имею, как воспроизвести его. Если бы я мог воспроизвести, я не буду задавать этот вопрос :) –
Я бы начал с кода и инициализировал все указатели C/C++ равными 0 (NULL). Если вы освободите что-либо, установите указатель на 0. Проверьте весь свой код, который выполняет удаление (C++) или бесплатно (C). Проверяйте любые массивы, которые вы пишете, чтобы убедиться, что вы не идете по концу. Ошибка вызывается при попытке и освобождении() указателя, который не имеет соответствующей записи выделения. Скорее всего, неинициализированный указатель или один уже освобожден, но не установлен на 0, или что-то случайно перешагнуло и исказило действительный указатель. Поскольку вы не можете его воссоздать, вы не можете многое сделать. –