Ошибка сегментации при захвате мьютекса

Ошибка сегментации при захвате мьютекса

27.04.2012 11:15:33 Просмотров 17 Источник

Господа профессионалы, подскажите пожалуйста, в чем может крыться подвох : мьютекс содержится в глобальной структуре, нормально инициализируется, нормально захватывается и освобождается потоками, но только несколько раз... Цикл, в котором происходит работа с данным мьютексом идентичный для всех дочерних потоков, проходит валидно 3-5 раз, при попытке очередного захвата pthread_mutex_lock генерирует SIGSEGV.

При разборе дампа в gdb ошибка сегментации по-прежнему вылезает при обращении к pthread_mutex_lock, но сильно сомневаюсь, что проблема в вызове. Напрямую отладчиком и valgrind-ом пока не подобраться, адреса, которые передаются в функцию - валидны, однако вылезла интригующая вещь - завела переменную в стеке потока, в цикле пару раз вывела ее адрес - он изменился... при этом значение переменной, присвоенное при создании потока сохранилось. Моет кто-то сталкивался с подобным?

У вопроса есть решение - Посмотреть?

https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105171_105170
В gdb запускали?
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105176_105170
@dzhioev, нет пока, запуск под урезанной встраиваемой ОС, как только удастся залить туда gdb - попробую, пока отлаживаюсь по сообщениям журнала
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105189_105170
Скорее всего память портитится. В какую-нибудь статическую переменную (по адресам рядом с мьютексом) read(), strcmp() или что-то подобное не делаете ?
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105217_105170
@avp, да, это наиболее вероятная причина, буду сейчас дамп делать и разбираться, но меня интересует, может ли возникнуть что-то подобное по другим причнам, например при переполнение потокового стека, и как это отследить
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105237_105170
@margosh, Вы пишете об "урезанной встраиваемой ОС". Тут мне трудно говорить о причинах. Вы адрес какой-нибудь переменной из стека потока распечатайте и сравните с адресами static данных. Еще можно попробовать переполнить стек какого-нибудь потока (например рекурсией) и посмотреть что будет (в смысле сигнала).
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment105263_105170
@avp, спасибо
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment106709_105170
Интересное поведение стека. Впервые слышу о таком, хотя теоретически можно представить. Попробуйте все перекомпилировать с -fPIC (но это чисто интуитивное предположение для gcc). Если не поможет, попробуйте мьютексы, их атрибуты и т.п. размещать в куче (malloc()). @margosh, а что у Вас за система, если не секрет ?
https://ru.stackoverflow.com/questions/105170/%d0%9e%d1%88%d0%b8%d0%b1%d0%ba%d0%b0-%d1%81%d0%b5%d0%b3%d0%bc%d0%b5%d0%bd%d1%82%d0%b0%d1%86%d0%b8%d0%b8-%d0%bf%d1%80%d0%b8-%d0%b7%d0%b0%d1%85%d0%b2%d0%b0%d1%82%d0%b5-%d0%bc%d1%8c%d1%8e%d1%82%d0%b5%d0%ba%d1%81%d0%b0#comment106738_105170
@avp, FreeBSD. Спасибо, попробую

Ответы - Ошибка сегментации при захвате мьютекса / Ошибка сегментации при захвате мьютекса

Является ответом!
margosh

04.05.2012 05:41:27

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

Закрыть X