![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ObjAuto и Intel XEON
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 ?