![]() |
| ||
|
|
Новости |
Поиск |
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]
d_oleg (2007-08-13 08:53:00) [1]http://www.delphikingdom.com/asp/answer.asp?IDAnswer=54303
oxffff (2007-08-08 21:39:00) [2]
> Причину когерентности кешей мы устранили.
не когерентности. :)
oxffff (2007-08-08 17:06:00) [3]Причину когерентности кешей мы устранили.
Использую выше xchg или FlushInstructionCache
Для гарантии использовали даже SetProcessAffinityMask
Значит причина не в этом.
Остается либо DEP, либо какие-то еще моменты мне не известные.
Рекомендую обратиться на WASM.ru.
Если напишешь туда, оставь пожалуйста ссылку на созданную тему.
oxffff (2007-08-08 16:53:00) [4]
> d_oleg © (08.08.07 16:44) [24]
>
> > А такой код на чем вылетает?
>
> на call eax;
Значит не дает он тебе выполнить код из области стека и кучи.
d_oleg (2007-08-08 16:44:00) [5]
> А такой код на чем вылетает?
на call eax;
oxffff (2007-08-08 13:39:00) [6]Ты решил свою проблему?
oxffff (2007-08-07 20:56:00) [7]
> d_oleg © (07.08.07 17:10) [21]
>
> > call Eax он выполняет нормально
>
> нет, ошибка вылетает именно на этой инструкции
А такой код на чем вылетает?
procedure TForm1.Button1Click(Sender: TObject);
var RetOpCode:byte;
pRetopCode:pbyte;
begin
RetOpCode:=$C3;
FlushInstructionCache(GetCurrentProcess,@RetOpCode,1);
asm
lea eax,RetOpCode;
call eax;
end;
new(pRetopCode);
pRetopCode^:=$C3;
FlushInstructionCache(GetCurrentProcess,pRetopCode,1);
asm
mov eax,pRetopCode;
call eax;
end;
Dispose(pRetopCode);
end;
d_oleg (2007-08-07 17:10:00) [8]
> call Eax он выполняет нормально
нет, ошибка вылетает именно на этой инструкции
oxffff (2007-08-07 16:38:00) [9]call Eax он выполняет нормально?
oxffff (2007-08-07 16:19:00) [10]
> 2ой вариант - тот же самый AV, в точности, но уже сразу
> при запуске.
На какой инструкции спотыкается?
d_oleg (2007-08-07 15:54:00) [11]1ый вариант:
24
Ret opcode C3=C3
Offset to Return static Buffer=C8A9C0
Access violation at address 00C8A9C0. Write of address 00C8A9C0
2ой вариант - тот же самый AV, в точности, но уже сразу при запуске.
3ий вариант - тот же самый AV при обращении к событию (при нажатии кнопки)
Ну и со sleep - то же самое.
oxffff (2007-08-07 13:48:00) [12]Для гарантии добавим еще Sleep(0)
procedure TForm1.FormCreate(Sender: TObject);
var
AExecuteMethod: TMethod;
PropInfo: PPropInfo;
TypeData: PTypeData;
begin
SetProcessAffinityMask(GetCurrentProcess,1);
sleep(0);
PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
TypeData := GetTypeData(PropInfo.PropType^);
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;
oxffff (2007-08-07 13:34:00) [13]Ты решил свою проблему или нет?
Попробуй использование SetProcessAffinityMask
procedure TForm1.FormCreate(Sender: TObject);
var
AExecuteMethod: TMethod;
PropInfo: PPropInfo;
TypeData: PTypeData;
begin
SetProcessAffinityMask(GetCurrentProcess,1);
PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
TypeData := GetTypeData(PropInfo.PropType^);
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;
oxffff (2007-08-07 12:16:00) [14]А так где ошибка?
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);
asm
mov eax,AExecuteMethod.TMethod.data;
add eax,$10;
mov cl,$c3;
xchg byte ptr [eax],cl;
call eax;
end;
FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;
oxffff (2007-08-07 10:54:00) [15]procedure TForm1.FormCreate(Sender: TObject);
var
AExecuteMethod: TMethod;
PropInfo: PPropInfo;
TypeData: PTypeData;
Pb:pbyte;
begin
PropInfo := GetPropInfo(Button1, 'OnClick', [tkMethod]);
TypeData := GetTypeData(PropInfo.PropType^);
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
showmessage(inttostr(Tobject(AExecuteMethod.Data).InstanceSize));
Pb:=AExecuteMethod.Data;
inc(pb,$10);
showmessage('Ret opcode C3 = '+IntToHex(pb^,0));
showmessage('Offset to Return static Buffer = '+IntToHex(DWORD(pb),0));
FlushInstructionCache(GetCurrentProcess,AExecuteMethod.Data,Tobject(AExecuteMeth od.Data).InstanceSize);
SetMethodProp(Button1, PropInfo, AExecuteMethod);
end;
Запусти на Xeon. Напиши, что пишет. И напиши полностью AV
d_oleg (2007-08-07 10:40:00) [16]
> Так тебе помогло или нет?
на не-ксеоне все нормально, на ксеоне тот же AV
> Приведи описание AV.
Access violation at address ####. Write of address ####.
> у тебя такая последовательность?
да, последовательность именно такая.
oxffff (2007-08-07 10:35:00) [17]
> d_oleg © (07.08.07 09:34) [10]
>
> > более того, в таком варианте AV есть уже и на "обычных"
>
> > процессорах...
>
> а нет, сбрехал, на "обычных" запускается :)
Так тебе помогло или нет?
oxffff (2007-08-07 09:36:00) [18]
> d_oleg © (07.08.07 09:26) [9]
>
> > Именно на этом JMP, который я привел в [2]?
> да-да
>
>
> > Вставь код FlushInstructionCache
> > Должно помочь. :)
> не помогло :(
> более того, в таком варианте AV есть уже и на "обычных"
> процессорах...
у тебя такая последовательность?
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;
У меня нет AV на "обычном процессоре".
FlushInstructionCache надо добавить после
AExecuteMethod := CreateMethodPointer(TSimpleEvent.Create, TypeData);
Приведи описание AV.
d_oleg (2007-08-07 09:34:00) [19]
> более того, в таком варианте AV есть уже и на "обычных"
> процессорах...
а нет, сбрехал, на "обычных" запускается :)
d_oleg (2007-08-07 09:26:00) [20]
> Именно на этом JMP, который я привел в [2]?
да-да
> Вставь код FlushInstructionCache
> Должно помочь. :)
не помогло :(
более того, в таком варианте AV есть уже и на "обычных" процессорах...