Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ObjAuto и Intel XEON


Страницы:   1 2

d_oleg ©   (2007-08-06 16:48:00) 

Простой пример присвоения обработчика событий через ObjAuto.CreateMethodPointer. Все хорошо, на pentium/celeron работатет, а вот на финальной стадии тестирования на сервере (dual Xeon) - не работает :(
Чую, что дело в разрядности процессора (соотв. с размером регистра) но вот что делать - пока даже не представляю.

Пример тут: [href] http://qc.codegear.com/wc/AttachmentHandler.ashx?r=50097&fn=50097.zip[/href]


oxffff   (2007-08-07 09:00:00) [21]


> d_oleg ©   (06.08.07 23:19) [4]
>
> > Наиболее вероятная причина здесь это DEP.
> DEP обычно сам ругается, а тут - просто вылетает AV :(
>
>
> > Интерес представляют две последние инструкции
> да, вылет AV происходит именно при попытке JMP


Именно на этом JMP, который я привел в [2]?

Тогда, если у тебя отключен DEP.
А он у тебя точно отключен, иначе бы ругался.

Вставь код

FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);

после вызова
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);

В итоге у тебя должно быть

procedure TForm1.FormCreate(Sender: TObject);
var
 AExecuteMethod: TMethod;
 PropInfo: PPropInfo;
 TypeData: PTypeData;
begin
 PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
 TypeData := GetTypeData(PropInfo.PropType^);
 AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
 FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);
 SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;

Должно помочь. :)


Anatoly Podgoretsky   (2007-08-07 00:03:00) [22]

> DrPass  (06.08.2007 23:57:06)  [6]

Тем что у него есть еще два дополнительных бита в адресе, на физическом уровне.


DrPass   (2007-08-06 23:57:00) [23]


> я почему про разрядность заговорил - там местами явно указывается
> смещение на постоянную величину

a) Причем здесь разрядность?
б) А чем разрядность Ксеона отличается от разрядности всех остальных x86 процессоров вплоть до 386, выпущенного в 1985 году?


d_oleg   (2007-08-06 23:21:00) [24]

я почему про разрядность заговорил - там местами явно указывается смещение на постоянную величину, может быть в этом дело?


d_oleg   (2007-08-06 23:19:00) [25]


> Наиболее вероятная причина здесь это DEP.
DEP обычно сам ругается, а тут - просто вылетает AV :(


> Интерес представляют две последние инструкции
да, вылет AV происходит именно при попытке JMP


oxffff   (2007-08-06 20:32:00) [26]

Таким образом статический массив TMethodHandlerInstance.Return используется для динамического формирования кода возврата с Clean-up входных параметров или без него.


oxffff   (2007-08-06 20:28:00) [27]

Наиболее вероятная причина здесь это DEP.
Я слегка исследовал код.
И нашел доказательство в пользу этой версии.

Интерес представляют две последние инструкции TMethodHandlerInstance.RegisterStub;

   LEA     ECX,[ECX].TMethodHandlerInstance.Return
    // Jump to the actual return instruction since it is most likely not just a RET
   JMP     ECX

Таким образом происходит  переход по адресу в куче (а страницы памяти должны содержать включенный бит защиты от исполнения при активированном DEP)

Так что решение твоей проблемы это отключение DEP.


tesseract   (2007-08-06 18:23:00) [28]


> Чую, что дело в разрядности процессора (соотв. с размером
> регистра) но вот что делать - пока даже не представляю.


А может пробема в SMP ?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо