Я столкнулся с ошибкой из-за "повреждения указателя" в моей программе.Вот ошибочный код, который приводит к сбою.
list_ptr = list_head;
while(list_ptr) {
printf("The value of list ptr is now %p\n", list_ptr);
//do something;
list_ptr = list_ptr->next;
printf("After increment, the value of list ptr is now %p\n", list_ptr);
}
Теперь, когда я запускаю программу, я получаю следующий вывод в конце списка:
..
..
..
The value of list ptr is 0x74c770
After increment, the value of list ptr is 0x6da280
The value of list ptr is 0x6da281
After increment, the value of list ptr is 0xce00000000006e80
Значениесписок ptr равен 0x6da280 к концу одной итерации, но к моменту начала следующей итерации он изменяется на 0x6da281.После этого попытка получить доступ к ptr-> next, по-видимому, возвращает значение 0xce00000000006e80, которое не является указателем значения.
Это многопоточная программа, и указатель списка доступен двум другим потокам.Но я использую блокировки мьютекса на каждом из этих доступов.
Я снова попытался запустить программу в аналогичном режиме, но не смог получить ту же ошибку.Однако он все еще падает в том же цикле.Я предполагаю, что указатель все еще искажается, но на этот раз после того, как я напечатал значение.
Любые предложения?
Я использую Red Hat Enterprise Linux 6.1.
Заранее спасибо.
Редактировать : Сначала я тоже подозревал состояние гонки, но теперь я уверен, что это не так.Хотя к рассматриваемой переменной обращаются внутри двух других потоков, все они используют надлежащие блокировки мьютекса.
Это многопоточная программа, которая разветвляется на 500 детей.Проблема появляется где-то после 470-го форка (она не была последовательной).См. Рассматриваемый список - это глобальная структура данных, поддерживаемая родителем для отслеживания его потомков.Каждый раз, когда новый дочерний элемент разветвляется, соответствующая запись добавляется в этот список.Где-то после 470-го разветвления, когда список просматривается, кажется, что произошла ошибка.
Мой коллега подозревает, что это может быть связано с повреждением стека.Но мы еще не смогли это проверить.