printf по памяти
Добрый день! Интересная проблема нарисовалась.
Есть большой и сложный проект, практически SCADA система. Вдруг (как обычно) обнаружилась ошибка - при разыменовании указателя (глобальная переменная) получаем ошибку сегментации. Ну вроде понятно, перетирается указатель. Однако перетирается интересным образом - функцией printf(). То есть в нескольких потоках (printf потокобезопасна) есть вызовы printf(«бла бла бла»), и в какой-то момент это самое «бла бла бла» начинает выводится прямо по глобальным переменным, т. е. если было глобально определено
char a=1,b=2,c=3;
Посмотрел в файле stdio.h, там stdout определен как &__iob[1], где __iob[] - массив FILE. При этом указатель на позицию в буффере в структуре stdout как раз приходится на адреса глобальных переменных, причем сам буффер (base addr) расположен дальше в памяти, количество свободных элементов в буффере порядка 15тыс.
В общем-то вопрос и заключается в следующем - как может изменится (перетереться?) адрес в указателе позиции буффера в stdout? Переменные, располагающиеся в памяти вокруг stdout в полном порядке. И как можно отследить эту ситуацию? Запустить под отладчиком - проблема.
ОС - solaris 2.5.1 на SPARCstation-10