код примерно такой - mov byte [ebx+10],0 ; тут ebx указывает на буффер в памяти бла бла бла pthread_create push 300000 call usleep add esp,4 push dword [ebx+10] ; тут всё тот же ebx как бы всё работает... но вот один раз вывесилось на push dword [ebx+10], причём ebx имел значение указывающее куда то в жопу (0xFF**) если бы он изначально был неверный, то ошибка был бы на 10 инструкций раньше (см начало) получается pthread_create или usleep изменили значение ebx - такое разве допускается?
буффер выделяется из большого блока предвыделенной памяти выделения-освобождения физически не происходит и память лежит уж точно не на (0xFF**) в любом случае получается что в процессе выполнения двух функций ebx изменился. я смотрел их обе - вообщем то они у себя сохраняют и восстанавливают регистры, другое дело нет ли там багов в либах и нет ли ситуация когда прерывание чем то выполнения функции не влечёт восстановление состояния регистов
CLG Я подумал, и не придумал способа как функция может обойти pushad/popad. То есть она конечно же может, но для этого надо специально заморачиваться, случайно это не выйдет, тем более если писать на C. Можно ещё предположить что компилятор C глючный, но я не думаю что влияет это. Собственно идей у меня нет, почему так может случаться. Может код у тебя как-то неявно меняет %ebx? Я не припомню инструкций, которые могут _неявно_ менять %ebx, но всё же. Обычно неявно меняется %edx, скажем при idiv. Да и если функцию ты вызывал, которая long long возвращает, то тоже менялся бы %edx. Да и эпизодичность проявления бага, как бы намекает на войны потоков. А что за реализация pthreads используется? Там точно kernel-space потоки, или что-нибудь юзерспейсное в стиле libpth? Кстати, а ядерные потоки где сохраняют контекст при переключении? В ядерном адресном пространстве, или на стеке потока? Любопытный вопрос, будет время, я гляну. А ты посмотри -- нигде у тебя нет какого-нибудь переполнения буфера, может ты сам затираешь сохранённое значение %ebx контекста? ps. Сорри за поток сознания, но я без идей, и судя по всему остальные -- тоже.