Как может, malloc () вызывают SIGSEGV?

lsof и термофиксатор являются действительно двумя способами найти процесс, который сохраняет определенный файл открытым. Если Вы просто хотите, чтобы umount успешно выполнился, необходимо исследовать его-f и-l опции.

8
задан user19745 17 September 2009 в 20:10
поделиться

6 ответов

malloc может segfault, например, когда куча повреждена. Убедитесь, что вы не записываете ничего, выходящего за рамки предыдущего выделения.

26
ответ дан 5 December 2019 в 04:30
поделиться

Вероятно, нарушение памяти происходит в другой части вашего кода. Если вы работаете в Linux, вам обязательно стоит попробовать valgrind. Я бы никогда не стал доверять своим собственным программам на C, если они не пройдут valgrind.

РЕДАКТИРОВАТЬ: еще один полезный инструмент - Электрический забор . Glibc также предоставляет переменную окружения MALLOC_CHECK_ , чтобы помочь отладить проблемы с памятью. Эти два метода не влияют на скорость бега так сильно, как valgrind.

17
ответ дан 5 December 2019 в 04:30
поделиться

Возможно, вы испортили кучу где-то перед этим вызовом переполнением буфера или вызовом free с указателем, который не был выделен malloc (или это уже было освобождено).

Если внутренние структуры данных, используемые malloc, повреждены таким образом, malloc использует недопустимые данные и может дать сбой.

12
ответ дан 5 December 2019 в 04:30
поделиться

Существует множество способов запустить дамп ядра из malloc () realloc () и calloc () ). К ним относятся:

  • Переполнение буфера: запись за пределами конца выделенного пространства (информация управления нарушением, которую malloc () хранила там).
  • Недополнение буфера: запись перед началом выделенного пространства (вытаскивание управляющей информации, которую malloc () хранило там).
  • Освобождение памяти, которая не была выделена malloc () . В смешанной программе C и C ++ это будет включать освобождение памяти, выделенной в C ++, с помощью new .
  • Освобождение указателя, который частично указывает на блок памяти, выделенный с помощью malloc () , что является частным случаем предыдущего случая.
  • Освобождение уже освобожденного указателя - пресловутое ' double free '.

Использование диагностической версии malloc () или включение диагностики в стандартной версии вашей системы может помочь выявить некоторые из этих проблем. Например, он может обнаруживать небольшие переполнения и переполнения (поскольку он выделяет дополнительное пространство для обеспечения буферной зоны вокруг запрошенного вами пространства) и, вероятно, может обнаруживать попытки освободить память, которая не была выделена или уже была освобождена. или указатели частично проходят через выделенное пространство - потому что они будут хранить информацию отдельно от выделенного пространства. Цена в том, что отладочная версия занимает больше места.

4
ответ дан 5 December 2019 в 04:30
поделиться

Вы должны попытаться отладить этот код изолированно, чтобы увидеть, действительно ли проблема находится там, где генерируется segfault. (Я подозреваю, что это не так.)

Это означает:

# 1: Скомпилируйте код с -O0, чтобы убедиться, что gdb получает правильную информацию о нумерации строк.

# 2: Напишите модульный тест, который вызывает эту часть кода.

Я предполагаю, что код будет работать правильно при отдельном использовании. Затем вы можете протестировать другие модули таким же образом, пока не выясните, что вызывает ошибку.

Использование Valgrind, как предлагали другие, также является очень хорошей идеей.

1
ответ дан 5 December 2019 в 04:30
поделиться

The code is problematic. If malloc returns NULL, this case is not handled correctly in your code. You simply assume that memory has been allocated for you when it actually has not been. This can cause memory corruption.

0
ответ дан 5 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: