LINUX.ORG.RU

захламление регистров - проблема


0

1

как такое может быть вообще?

код примерно такой -

mov byte [ebx+15],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 - такое разве допускается?!

но вот один раз вывесилось на push dword [ebx+10], причём ebx имел значение указывающее куда то в жопу (0xFF**)

Эта жопа называется kernel space ;)

получается pthread_create или usleep изменили значение ebx - такое разве допускается?!

Нет. Версию компилятора, libc, ядра и кусок кода в студию.

mv ★★★★★
()

>получается pthread_create или usleep изменили значение ebx - такое разве допускается?!

По идее это должно зависеть от соглашения о вызове. Почему и нет. Очень вероятно, что тебе надо самому беспокоится о сохранении регистра ebx.

pathfinder ★★★★
()
Ответ на: комментарий от mv

я так пологаю с таким же успехом там могло что угодно быть, не только FF**. прога юзермоде, высоконагружаемое сокетное приложение дело вообще в том, что чудодейственным образом ebx был изменён в процессе вызова thread_create или usleep

кусок кода смотри в первом сообщении пишу на fasm, компилирую им же, собираю через gcc -s -pthread bs.o -o bs -lc

т.е. что пишу, то и вижу в отладчике лишних инструкций не добавляется

запускал на freebsd 7.3 stable версию libc хз как посмотреть. используется libc.so.7

CDC7771
() автор топика
Ответ на: комментарий от pathfinder

в соглашениях как раз ebx esi edi ebp должны сохраняться

CDC7771
() автор топика
Ответ на: комментарий от CDC7771

Баг. Или fbsd не следует

SYSTEM V
APPLICATION
BINARY INTERFACE
Intel386™ Architecture
Processor Supplement

mv ★★★★★
()

может железка глючная? :)

true_admin ★★★★★
()
Ответ на: комментарий от CDC7771

>что чудодейственным образом ebx был изменён в процессе вызова thread_create или usleep

можно в дизасме посмотреть, что они делают с ebx... только придётся, наверное, вглубь вплоть до ядра вгрызаться)

Yareg ★★★
()
Ответ на: комментарий от Yareg

отладчик показывает, что обе функции внутри libc сохраняют в стеке регистры и восстанавливают их при выходе

где нибудь описано нестандартное может поведение при обрывании выполнения функций?

CDC7771
() автор топика
Ответ на: комментарий от CDC7771

Ну функция то может оборваться только по рет... Если в теле функции нет лишних рет и нет джампов через то метро, где регистры возвращаются из стэка, то это чудо.

Yareg ★★★
()
Ответ на: комментарий от CDC7771

Для начала попробуй стабильно воспроизвести, как уже сказали похоже на баг в libc/kernel, по текущим данным не починишь.

frey ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.