lsof и термофиксатор являются действительно двумя способами найти процесс, который сохраняет определенный файл открытым. Если Вы просто хотите, чтобы umount успешно выполнился, необходимо исследовать его-f и-l опции.
malloc
может segfault, например, когда куча повреждена. Убедитесь, что вы не записываете ничего, выходящего за рамки предыдущего выделения.
Вероятно, нарушение памяти происходит в другой части вашего кода. Если вы работаете в Linux, вам обязательно стоит попробовать valgrind. Я бы никогда не стал доверять своим собственным программам на C, если они не пройдут valgrind.
РЕДАКТИРОВАТЬ: еще один полезный инструмент - Электрический забор . Glibc также предоставляет переменную окружения MALLOC_CHECK_ , чтобы помочь отладить проблемы с памятью. Эти два метода не влияют на скорость бега так сильно, как valgrind.
Возможно, вы испортили кучу где-то перед этим вызовом переполнением буфера или вызовом free
с указателем, который не был выделен malloc
(или это уже было освобождено).
Если внутренние структуры данных, используемые malloc, повреждены таким образом, malloc использует недопустимые данные и может дать сбой.
Существует множество способов запустить дамп ядра из malloc ()
(и realloc ()
и calloc ()
). К ним относятся:
malloc ()
хранила там). malloc ()
хранило там). malloc ()
. В смешанной программе C и C ++ это будет включать освобождение памяти, выделенной в C ++, с помощью new
. malloc ()
, что является частным случаем предыдущего случая. Использование диагностической версии malloc ()
или включение диагностики в стандартной версии вашей системы может помочь выявить некоторые из этих проблем. Например, он может обнаруживать небольшие переполнения и переполнения (поскольку он выделяет дополнительное пространство для обеспечения буферной зоны вокруг запрошенного вами пространства) и, вероятно, может обнаруживать попытки освободить память, которая не была выделена или уже была освобождена. или указатели частично проходят через выделенное пространство - потому что они будут хранить информацию отдельно от выделенного пространства. Цена в том, что отладочная версия занимает больше места.
Вы должны попытаться отладить этот код изолированно, чтобы увидеть, действительно ли проблема находится там, где генерируется segfault. (Я подозреваю, что это не так.)
Это означает:
# 1: Скомпилируйте код с -O0, чтобы убедиться, что gdb получает правильную информацию о нумерации строк.
# 2: Напишите модульный тест, который вызывает эту часть кода.
Я предполагаю, что код будет работать правильно при отдельном использовании. Затем вы можете протестировать другие модули таким же образом, пока не выясните, что вызывает ошибку.
Использование Valgrind, как предлагали другие, также является очень хорошей идеей.
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.