powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Invalid variant type
25 сообщений из 27, страница 1 из 2
Invalid variant type
    #40002625
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такой метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
const
  CNULL_ID = -1;

type
  TMyRec = record
    Field1: Int64;
    Field2: Int64;
end;

procedure TMyClass.WriteRec(const ADataSet: IInterface;
  const ARec: TMyRec; const AName1, AName2: string);
begin
  WriteField(ADataSet, AName1, ARec.Field1, CNULL_ID);
  WriteField(ADataSet, AName2, ARec.Field2, CNULL_ID);
end;

procedure WriteField(const ADataSet: IInterface;
  const AFieldName: string; const AValue, ANullValue: OleVariant);
begin
  Log(AFieldName);
  ...........
end;

При вызове WriteRec происходит ошибка Invalid variant type. До вызова Log(AFieldName); дело не доходит.

Причем ошибка плавающая. Проявляется только в Release конфигурации. Если пытаюсь добавлять логирование ошибка может переместиться в другой метод или вообще пропасть. Изначально ошибка была и в 32 битной версии и в 64. Сейчас только в 64.

Я так понимаю, что причина или в повреждении стека или в том, что по входу в процедуру OleVariant переменные не заливаются нулями.

Компилирую в 10.3.1. До этого код собирался в XE3.

FastMM4 в FullDebugMode проблем не показывает.

Вопроса два:
1. Не попадалась ли кому-нибудь подобная бага в qc?
2. Как его локализовать? Ассемблер отлаживать?

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Invalid variant type
    #40002634
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_При вызове WriteRec происходит ошибка Invalid variant type.

Пробовал явно задать своей константе тип, совместимый с OleVariant?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Invalid variant type
    #40002640
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Пробовал явно задать своей константе тип, совместимый с OleVariant?
Компилятор ее преобразует к varInteger.

Что-то радикально менять пока не хочу, потому что пропадание ошибки мне ничего не скажет. Хочется вначале диагностировать причину, а потом уже что-то делать.

Даже такая модификация
Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TMyClass.WriteRec(const ADataSet: IInterface;
  const ARec: TMyRec; const AName1, AName2: string);
begin
  Log('Test');
  WriteField(ADataSet, AName1, ARec.Field1, CNULL_ID);
  WriteField(ADataSet, AName2, ARec.Field2, CNULL_ID);
end;

ошибку устраняет
...
Рейтинг: 0 / 0
Invalid variant type
    #40002663
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Inline используется?
...
Рейтинг: 0 / 0
Invalid variant type
    #40002667
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Inline используется?
Да.

Вот полный код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
const
  CNULL_ID = -1;

type
  TMyRec = record
    Field1: Int64;
    Field2: Int64;
end;

procedure TMyClass.WriteRec(const ADataSet: IInterface;
  const ARec: TMyRec; const AName1, AName2: string); inline;
begin
  WriteField(ADataSet, AName1, ARec.Field1, CNULL_ID);
  WriteField(ADataSet, AName2, ARec.Field2, CNULL_ID);
end;

procedure WriteField(const ADataSet: IInterface;
  const AFieldName: string; const AValue, ANullValue: OleVariant); overload; inline;
begin
  WriteField(ADataSet, AFieldName, AValue, ANullValue, -1);
end;

procedure WriteField(const ADataSet: IInterface;
  const AFieldName: string; const AValue, ANullValue: OleVariant; AArgs: Integer); overload;
begin
  Log(AFieldName);
  ...........
end;
...
Рейтинг: 0 / 0
Invalid variant type
    #40002673
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Для начала, отключи инлайн и оптимизацию директивами.
...
Рейтинг: 0 / 0
Invalid variant type
    #40002679
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Для начала, отключи инлайн и оптимизацию директивами.
У тебя что-то подобное было?

Я Дмитрию уже говорил, что пропадание ошибки мне ничего не скажет. Потому что она пропадает от произвольной модификации кода.

Хочется вначале диагностировать ошибку, а потом уже исправлять.

Думал сделать дамп стека, но для x86 у меня получилось достать указатель на переменные в стеке

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure GetStack(out ATop: Pointer; out ALen: NativeInt);
{$IFDEF CPUX86}
asm
  mov [eax], ebp
  mov eax, ebp
  sub eax, esp
  sub eax, 4
  mov [edx], eax
end
{$ENDIF}

то для x64 не получается. В x64 по входу в процедуру выполняется код
Код: pascal
1.
2.
3.
push rbp
sub rsb, $40
mov rbp, rsp

И как достать исходный rsp я пока не придумал
...
Рейтинг: 0 / 0
Invalid variant type
    #40002680
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Думал сделать дамп стека

Про Ctrl-Alt-C в курсе?
...
Рейтинг: 0 / 0
Invalid variant type
    #40002682
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
У тебя что-то подобное было?

Было всякое. Инлайн в дельфях очень... своеобразный, иху маму.

_Vasilisk_
Я Дмитрию уже говорил, что пропадание ошибки мне ничего не скажет.

Это, как минимум, укажет в каком направлении копать. Если после отключения инлайна глюк пропадёт, то можно будет в дебаге его принудительно включить, добиться воспроизведения и смотреть дизасм.
...
Рейтинг: 0 / 0
Invalid variant type
    #40003343
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я совсем потерялся. Создал воспроизводимый пример

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
function GetTopStack: Pointer; assembler;
asm
  {$IFDEF CPUX64}
  mov rax, rsp
  add rax, 8
  {$ELSE}
  mov eax, esp
  add eax, 4
  {$ENDIF}
end;

{$INLINE ON}
const
  CNULL_ID = -1;

type
  TMyRec = record
    Field1: Int64;
    Field2: Int64;
end;

procedure WriteFieldEx(const ADataSet: IInterface;
  const AFieldName: string; const AValue, ANullValue: OleVariant; AArg: Integer);
begin
//  Empty;
end;

procedure WriteField(const ADataSet: IInterface;
  const AFieldName: string; const AValue, ANullValue: OleVariant); {overload;} inline;
begin
  WriteFieldEx(ADataSet, AFieldName, AValue, ANullValue, -1);
end;

procedure WriteRec(const ADataSet: IInterface;
  const ARec: TMyRec; const AName1, AName2: string); inline;
begin
  WriteField(ADataSet, AName1, ARec.Field1, CNULL_ID);
  WriteField(ADataSet, AName2, ARec.Field2, CNULL_ID);
end;

procedure TestProc;
var
  LRec: TMyRec;
begin
  LRec.Field1 := 5;
  LRec.Field2 := 10;
  WriteRec(nil, LRec, 'name1', 'name2');
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  CReserved = 2048;
var
  LStack: PNativeInt;
  Li: Integer;
begin
  // Забиваем 2048 байт стека $FF, чтобы исключить всякую случайность
  LStack := GetTopStack;
  for Li := 0 to CReserved div (SizeOf(LStack^)) - 1 do begin
    Dec(LStack);
    LStack^ := -1;
  end;

  TestProc;
end;

При наличии overload ошибка есть, при отсутствии нет. Ассемблерный дамп в обоих случаях идентичный
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
Unit1.pas.226: begin
00890374 55               push ebp
00890375 8BEC             mov ebp,esp
00890377 B90A000000       mov ecx,$0000000a
0089037C 6A00             push $00
0089037E 6A00             push $00
00890380 49               dec ecx
00890381 75F9             jnz $0089037c
00890383 56               push esi
00890384 57               push edi
00890385 33C0             xor eax,eax
00890387 55               push ebp
00890388 68A3048900       push $008904a3
0089038D 64FF30           push dword ptr fs:[eax]
00890390 648920           mov fs:[eax],esp
Unit1.pas.227: LRec.Field1 := 5;
00890393 C745F005000000   mov [ebp-$10],$00000005
0089039A C745F400000000   mov [ebp-$0c],$00000000
Unit1.pas.228: LRec.Field2 := 10;
008903A1 C745F80A000000   mov [ebp-$08],$0000000a
008903A8 C745FC00000000   mov [ebp-$04],$00000000
Unit1.pas.229: WriteRec(nil, LRec, 'name1', 'name2');
008903AF 8D7DE0           lea edi,[ebp-$20]
008903B2 33C0             xor eax,eax
008903B4 AB               stosd 
008903B5 AB               stosd 
008903B6 AB               stosd 
008903B7 AB               stosd 
008903B8 33C0             xor eax,eax
008903BA 55               push ebp
008903BB 687B048900       push $0089047b
008903C0 64FF30           push dword ptr fs:[eax]
008903C3 648920           mov fs:[eax],esp
008903C6 8D45D0           lea eax,[ebp-$30]
008903C9 BAFFFFFFFF       mov edx,$ffffffff
008903CE B1FF             mov cl,$ff
008903D0 E8E3EFBAFF       call @OleVarFromInt
008903D5 8D45D0           lea eax,[ebp-$30]
008903D8 50               push eax
008903D9 6AFF             push $ff
008903DB 8B45F0           mov eax,[ebp-$10]
008903DE 8B55F4           mov edx,[ebp-$0c]
008903E1 52               push edx
008903E2 50               push eax
008903E3 8D45C0           lea eax,[ebp-$40]
008903E6 E8EDEFBAFF       call @OleVarFromInt64
008903EB 8D4DC0           lea ecx,[ebp-$40]
008903EE BABC048900       mov edx,$008904bc
008903F3 33C0             xor eax,eax
008903F5 E862FFFFFF       call WriteFieldEx
008903FA BEC8048900       mov esi,$008904c8
008903FF 8D7DE0           lea edi,[ebp-$20]
00890402 A5               movsd 
00890403 A5               movsd 
00890404 A5               movsd 
00890405 A5               movsd 
00890406 8B45F8           mov eax,[ebp-$08]
00890409 8B55FC           mov edx,[ebp-$04]
0089040C 52               push edx
0089040D 50               push eax
0089040E 8D45E0           lea eax,[ebp-$20]
00890411 E8C2EFBAFF       call @OleVarFromInt64
00890416 33C0             xor eax,eax
00890418 55               push ebp
00890419 685E048900       push $0089045e
0089041E 64FF30           push dword ptr fs:[eax]
00890421 648920           mov fs:[eax],esp
00890424 8D45B0           lea eax,[ebp-$50]
00890427 BAFFFFFFFF       mov edx,$ffffffff
0089042C B1FF             mov cl,$ff
0089042E E885EFBAFF       call @OleVarFromInt
00890433 8D45B0           lea eax,[ebp-$50]
00890436 50               push eax
00890437 6AFF             push $ff
00890439 8D4DE0           lea ecx,[ebp-$20]
0089043C BAE4048900       mov edx,$008904e4
00890441 33C0             xor eax,eax
00890443 E814FFFFFF       call WriteFieldEx
00890448 33C0             xor eax,eax
0089044A 5A               pop edx
0089044B 59               pop ecx
0089044C 59               pop ecx
0089044D 648910           mov fs:[eax],edx
00890450 6865048900       push $00890465
00890455 8D45E0           lea eax,[ebp-$20]
00890458 E85F8DBAFF       call @VarClr
0089045D C3               ret 

Ошибка возникает на втором call @OleVarFromInt64
...
Рейтинг: 0 / 0
Invalid variant type
    #40003376
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема здесь
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
008903FA BEC8048900       mov esi,$008904c8
008903FF 8D7DE0           lea edi,[ebp-$20]
00890402 A5               movsd 
00890403 A5               movsd 
00890404 A5               movsd 
00890405 A5               movsd 
00890406 8B45F8           mov eax,[ebp-$08]
00890409 8B55FC           mov edx,[ebp-$04]
0089040C 52               push edx
0089040D 50               push eax
0089040E 8D45E0           lea eax,[ebp-$20]
00890411 E8C2EFBAFF       call @OleVarFromInt64

С выделенной строки идет инициализация пустой TVarData. Но если в первом случае она тупо забивается нулями
Код: pascal
1.
2.
3.
4.
5.
6.
008903AF 8D7DE0           lea edi,[ebp-$20]
008903B2 33C0             xor eax,eax
008903B4 AB               stosd 
008903B5 AB               stosd 
008903B6 AB               stosd 
008903B7 AB               stosd 

то во втором идет копирование 16 байт с адреса $008904c8. Вот, в зависимости от наличия overload там лежат разные данные. Что это за адрес я не пойму
...
Рейтинг: 0 / 0
Invalid variant type
    #40003389
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если с WriteRec убрать inline, то получаем заливку 72 байта локальных переменных нулями. Не совсем понимаю почему 72, если SizeOf(TVarData) * 4 = 64. Зачем еще 8 байт? Ну да ладно.
...
Рейтинг: 0 / 0
Invalid variant type
    #40003716
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не воспроизводится, ни в 10.3.3, ни в 10.4.1.
...
Рейтинг: 0 / 0
Invalid variant type
    #40003904
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Не воспроизводится, ни в 10.3.3, ни в 10.4.1.
А можешь показать ассемблерный дамп для TestProc в этих версиях?
...
Рейтинг: 0 / 0
Invalid variant type
    #40003934
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 10.2.3 тоже не могу воспроизвести.

Возможно, это что-то появилось в 10.3 / 10.3.1 и было исправлено в 10.3.3.
...
Рейтинг: 0 / 0
Invalid variant type
    #40003935
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
10.3.3
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
Unit1.pas.69: begin
005FD218 55               push ebp
005FD219 8BEC             mov ebp,esp
005FD21B B90A000000       mov ecx,$0000000a
005FD220 6A00             push $00
005FD222 6A00             push $00
005FD224 49               dec ecx
005FD225 75F9             jnz $005fd220
005FD227 57               push edi
005FD228 33C0             xor eax,eax
005FD22A 55               push ebp
005FD22B 6843D35F00       push $005fd343
005FD230 64FF30           push dword ptr fs:[eax]
005FD233 648920           mov fs:[eax],esp
Unit1.pas.70: LRec.Field1 := 5;
005FD236 C745E005000000   mov [ebp-$20],$00000005
005FD23D C745E400000000   mov [ebp-$1c],$00000000
Unit1.pas.71: LRec.Field2 := 10;
005FD244 C745E80A000000   mov [ebp-$18],$0000000a
005FD24B C745EC00000000   mov [ebp-$14],$00000000
Unit1.pas.72: WriteRec(nil, LRec, 'name1', 'name2');
005FD252 8D7DF0           lea edi,[ebp-$10]
005FD255 33C0             xor eax,eax
005FD257 AB               stosd 
005FD258 AB               stosd 
005FD259 AB               stosd 
005FD25A AB               stosd 
005FD25B 33C0             xor eax,eax
005FD25D 55               push ebp
005FD25E 681BD35F00       push $005fd31b
005FD263 64FF30           push dword ptr fs:[eax]
005FD266 648920           mov fs:[eax],esp
005FD269 8D45D0           lea eax,[ebp-$30]
005FD26C BAFFFFFFFF       mov edx,$ffffffff
005FD271 B1FF             mov cl,$ff
005FD273 E8C0D9E3FF       call @OleVarFromInt
005FD278 8D45D0           lea eax,[ebp-$30]
005FD27B 50               push eax
005FD27C 6AFF             push $ff
005FD27E 8B45E0           mov eax,[ebp-$20]
005FD281 8B55E4           mov edx,[ebp-$1c]
005FD284 52               push edx
005FD285 50               push eax
005FD286 8D45C0           lea eax,[ebp-$40]
005FD289 E8CAD9E3FF       call @OleVarFromInt64
005FD28E 8D4DC0           lea ecx,[ebp-$40]
005FD291 BA5CD35F00       mov edx,$005fd35c
005FD296 33C0             xor eax,eax
005FD298 E873FFFFFF       call WriteFieldEx
005FD29D 8D7DF0           lea edi,[ebp-$10]
005FD2A0 33C0             xor eax,eax
005FD2A2 AB               stosd 
005FD2A3 AB               stosd 
005FD2A4 AB               stosd 
005FD2A5 AB               stosd 
005FD2A6 8B45E8           mov eax,[ebp-$18]
005FD2A9 8B55EC           mov edx,[ebp-$14]
005FD2AC 52               push edx
005FD2AD 50               push eax
005FD2AE 8D45F0           lea eax,[ebp-$10]
005FD2B1 E8A2D9E3FF       call @OleVarFromInt64
005FD2B6 33C0             xor eax,eax
005FD2B8 55               push ebp
005FD2B9 68FED25F00       push $005fd2fe
005FD2BE 64FF30           push dword ptr fs:[eax]
005FD2C1 648920           mov fs:[eax],esp
005FD2C4 8D45B0           lea eax,[ebp-$50]
005FD2C7 BAFFFFFFFF       mov edx,$ffffffff
005FD2CC B1FF             mov cl,$ff
005FD2CE E865D9E3FF       call @OleVarFromInt
005FD2D3 8D45B0           lea eax,[ebp-$50]
005FD2D6 50               push eax
005FD2D7 6AFF             push $ff
005FD2D9 8D4DF0           lea ecx,[ebp-$10]
005FD2DC BA74D35F00       mov edx,$005fd374
005FD2E1 33C0             xor eax,eax
005FD2E3 E828FFFFFF       call WriteFieldEx
005FD2E8 33C0             xor eax,eax
005FD2EA 5A               pop edx
005FD2EB 59               pop ecx
005FD2EC 59               pop ecx
005FD2ED 648910           mov fs:[eax],edx
005FD2F0 6805D35F00       push $005fd305
005FD2F5 8D45F0           lea eax,[ebp-$10]
005FD2F8 E8AF78E3FF       call @VarClr
005FD2FD C3               ret 
005FD2FE E9EDBFE0FF       jmp @HandleFinally
005FD303 EBF0             jmp $005fd2f5
005FD305 33C0             xor eax,eax
005FD307 5A               pop edx
005FD308 59               pop ecx
005FD309 59               pop ecx
005FD30A 648910           mov fs:[eax],edx
005FD30D 6822D35F00       push $005fd322
005FD312 8D45F0           lea eax,[ebp-$10]
005FD315 E89278E3FF       call @VarClr
005FD31A C3               ret 
005FD31B E9D0BFE0FF       jmp @HandleFinally
005FD320 EBF0             jmp $005fd312
Unit1.pas.73: end;
005FD322 33C0             xor eax,eax
005FD324 5A               pop edx
005FD325 59               pop ecx
005FD326 59               pop ecx
005FD327 648910           mov fs:[eax],edx
005FD32A 684AD35F00       push $005fd34a
005FD32F 8D45B0           lea eax,[ebp-$50]
005FD332 8B1500134000     mov edx,[$00401300]
005FD338 B903000000       mov ecx,$00000003
005FD33D E872DCE0FF       call @FinalizeArray
005FD342 C3               ret 
005FD343 E9A8BFE0FF       jmp @HandleFinally
005FD348 EBE5             jmp $005fd32f
005FD34A 5F               pop edi
005FD34B 8BE5             mov esp,ebp
005FD34D 5D               pop ebp
005FD34E C3               ret 


10.4.1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
Unit1.pas.69: begin
0060E438 55               push ebp
0060E439 8BEC             mov ebp,esp
0060E43B B90A000000       mov ecx,$0000000a
0060E440 6A00             push $00
0060E442 6A00             push $00
0060E444 49               dec ecx
0060E445 75F9             jnz $0060e440
0060E447 57               push edi
0060E448 33C0             xor eax,eax
0060E44A 55               push ebp
0060E44B 682FE56000       push $0060e52f
0060E450 64FF30           push dword ptr fs:[eax]
0060E453 648920           mov fs:[eax],esp
Unit1.pas.70: LRec.Field1 := 5;
0060E456 C745E005000000   mov [ebp-$20],$00000005
0060E45D C745E400000000   mov [ebp-$1c],$00000000
Unit1.pas.71: LRec.Field2 := 10;
0060E464 C745E80A000000   mov [ebp-$18],$0000000a
0060E46B C745EC00000000   mov [ebp-$14],$00000000
Unit1.pas.72: WriteRec(nil, LRec, 'name1', 'name2');
0060E472 8D45D0           lea eax,[ebp-$30]
0060E475 BAFFFFFFFF       mov edx,$ffffffff
0060E47A B1FF             mov cl,$ff
0060E47C E87BCDE2FF       call @OleVarFromInt
0060E481 8D45D0           lea eax,[ebp-$30]
0060E484 50               push eax
0060E485 6AFF             push $ff
0060E487 8B45E0           mov eax,[ebp-$20]
0060E48A 8B55E4           mov edx,[ebp-$1c]
0060E48D 52               push edx
0060E48E 50               push eax
0060E48F 8D45C0           lea eax,[ebp-$40]
0060E492 E885CDE2FF       call @OleVarFromInt64
0060E497 8D4DC0           lea ecx,[ebp-$40]
0060E49A BA48E56000       mov edx,$0060e548
0060E49F 33C0             xor eax,eax
0060E4A1 E88AFFFFFF       call WriteFieldEx
0060E4A6 8D7DF0           lea edi,[ebp-$10]
0060E4A9 33C0             xor eax,eax
0060E4AB AB               stosd 
0060E4AC AB               stosd 
0060E4AD AB               stosd 
0060E4AE AB               stosd 
0060E4AF 8B45E8           mov eax,[ebp-$18]
0060E4B2 8B55EC           mov edx,[ebp-$14]
0060E4B5 52               push edx
0060E4B6 50               push eax
0060E4B7 8D45F0           lea eax,[ebp-$10]
0060E4BA E85DCDE2FF       call @OleVarFromInt64
0060E4BF 33C0             xor eax,eax
0060E4C1 55               push ebp
0060E4C2 6807E56000       push $0060e507
0060E4C7 64FF30           push dword ptr fs:[eax]
0060E4CA 648920           mov fs:[eax],esp
0060E4CD 8D45B0           lea eax,[ebp-$50]
0060E4D0 BAFFFFFFFF       mov edx,$ffffffff
0060E4D5 B1FF             mov cl,$ff
0060E4D7 E820CDE2FF       call @OleVarFromInt
0060E4DC 8D45B0           lea eax,[ebp-$50]
0060E4DF 50               push eax
0060E4E0 6AFF             push $ff
0060E4E2 8D4DF0           lea ecx,[ebp-$10]
0060E4E5 BA60E56000       mov edx,$0060e560
0060E4EA 33C0             xor eax,eax
0060E4EC E83FFFFFFF       call WriteFieldEx
0060E4F1 33C0             xor eax,eax
0060E4F3 5A               pop edx
0060E4F4 59               pop ecx
0060E4F5 59               pop ecx
0060E4F6 648910           mov fs:[eax],edx
0060E4F9 680EE56000       push $0060e50e
0060E4FE 8D45F0           lea eax,[ebp-$10]
0060E501 E8026DE2FF       call @VarClr
0060E506 C3               ret 
0060E507 E910B0DFFF       jmp @HandleFinally
0060E50C EBF0             jmp $0060e4fe
Unit1.pas.73: end;
0060E50E 33C0             xor eax,eax
0060E510 5A               pop edx
0060E511 59               pop ecx
0060E512 59               pop ecx
0060E513 648910           mov fs:[eax],edx
0060E516 6836E56000       push $0060e536
0060E51B 8D45B0           lea eax,[ebp-$50]
0060E51E 8B1500134000     mov edx,[$00401300]
0060E524 B903000000       mov ecx,$00000003
0060E529 E8D2CFDFFF       call @FinalizeArray
0060E52E C3               ret 
0060E52F E9E8AFDFFF       jmp @HandleFinally
0060E534 EBE5             jmp $0060e51b
0060E536 5F               pop edi
0060E537 8BE5             mov esp,ebp
0060E539 5D               pop ebp
0060E53A C3               ret 


...
Рейтинг: 0 / 0
Invalid variant type
    #40003937
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TestProc:
10.2.3
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
005CE6FC 55               push ebp
005CE6FD 8BEC             mov ebp,esp
005CE6FF B90C000000       mov ecx,$0000000c
005CE704 6A00             push $00
005CE706 6A00             push $00
005CE708 49               dec ecx
005CE709 75F9             jnz $005ce704
005CE70B 33C0             xor eax,eax
005CE70D 55               push ebp
005CE70E 68DAE75C00       push $005ce7da
005CE713 64FF30           push dword ptr fs:[eax]
005CE716 648920           mov fs:[eax],esp
Unit52.pas.70: LRec.Field1 := 5;
005CE719 C745E005000000   mov [ebp-$20],$00000005
005CE720 C745E400000000   mov [ebp-$1c],$00000000
Unit52.pas.71: LRec.Field2 := 10;
005CE727 C745E80A000000   mov [ebp-$18],$0000000a
005CE72E C745EC00000000   mov [ebp-$14],$00000000
Unit52.pas.72: WriteRec(nil, LRec, 'name1', 'name2');
005CE735 8B45E0           mov eax,[ebp-$20]
005CE738 8B55E4           mov edx,[ebp-$1c]
005CE73B 52               push edx
005CE73C 50               push eax
005CE73D 8D45D0           lea eax,[ebp-$30]
005CE740 E817A2E6FF       call @OleVarFromInt64
005CE745 8D45D0           lea eax,[ebp-$30]
005CE748 8945FC           mov [ebp-$04],eax
005CE74B 8D45C0           lea eax,[ebp-$40]
005CE74E BAFFFFFFFF       mov edx,$ffffffff
005CE753 B1FF             mov cl,$ff
005CE755 E8E2A1E6FF       call @OleVarFromInt
005CE75A 8D45C0           lea eax,[ebp-$40]
005CE75D 8945F8           mov [ebp-$08],eax
005CE760 8B45F8           mov eax,[ebp-$08]
005CE763 50               push eax
005CE764 6AFF             push $ff
005CE766 8B45FC           mov eax,[ebp-$04]
005CE769 8BC8             mov ecx,eax
005CE76B BAF4E75C00       mov edx,$005ce7f4
005CE770 33C0             xor eax,eax
005CE772 E86DFFFFFF       call WriteFieldEx
005CE777 8B45E8           mov eax,[ebp-$18]
005CE77A 8B55EC           mov edx,[ebp-$14]
005CE77D 52               push edx
005CE77E 50               push eax
005CE77F 8D45B0           lea eax,[ebp-$50]
005CE782 E8D5A1E6FF       call @OleVarFromInt64
005CE787 8D45B0           lea eax,[ebp-$50]
005CE78A 8945F4           mov [ebp-$0c],eax
005CE78D 8D45A0           lea eax,[ebp-$60]
005CE790 BAFFFFFFFF       mov edx,$ffffffff
005CE795 B1FF             mov cl,$ff
005CE797 E8A0A1E6FF       call @OleVarFromInt
005CE79C 8D45A0           lea eax,[ebp-$60]
005CE79F 8945F0           mov [ebp-$10],eax
005CE7A2 8B45F0           mov eax,[ebp-$10]
005CE7A5 50               push eax
005CE7A6 6AFF             push $ff
005CE7A8 8B45F4           mov eax,[ebp-$0c]
005CE7AB 8BC8             mov ecx,eax
005CE7AD BA0CE85C00       mov edx,$005ce80c
005CE7B2 33C0             xor eax,eax
005CE7B4 E82BFFFFFF       call WriteFieldEx
Unit52.pas.73: end;
005CE7B9 33C0             xor eax,eax
005CE7BB 5A               pop edx
005CE7BC 59               pop ecx
005CE7BD 59               pop ecx
005CE7BE 648910           mov fs:[eax],edx
005CE7C1 68E1E75C00       push $005ce7e1
005CE7C6 8D45A0           lea eax,[ebp-$60]
005CE7C9 8B1500134000     mov edx,[$00401300]
005CE7CF B904000000       mov ecx,$00000004
005CE7D4 E88FC7E3FF       call @FinalizeArray
005CE7D9 C3               ret 
005CE7DA E9B9AAE3FF       jmp @HandleFinally
005CE7DF EBE5             jmp $005ce7c6
005CE7E1 8BE5             mov esp,ebp
005CE7E3 5D               pop ebp
005CE7E4 C3               ret 


...
Рейтинг: 0 / 0
Invalid variant type
    #40003946
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо. Значит мне просто не повезло.

В 10.2.3 выделяется на 16 байт больше стека
Код: pascal
1.
2.
3.
4.
5.
005CE6FF B90C000000       mov ecx,$0000000c
005CE704 6A00             push $00
005CE706 6A00             push $00
005CE708 49               dec ecx
005CE709 75F9             jnz $005ce704

А в 10.3.3 и новее идет адекватное обнуление
Код: pascal
1.
2.
3.
4.
5.
005FD2A0 33C0             xor eax,eax
005FD2A2 AB               stosd 
005FD2A3 AB               stosd 
005FD2A4 AB               stosd 
005FD2A5 AB               stosd 

Откуда у меня movsd появился - великая тайна
...
Рейтинг: 0 / 0
Invalid variant type
    #40003951
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Address Lookup по $4904C8 (= $008904c8 - $00400000) что-то покажет?
...
Рейтинг: 0 / 0
Invalid variant type
    #40003977
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
Address Lookup
Я не вижу такого в делфи. Есть Goto Address. Тот если указать полный адрес (вместе с HInstance) то переходит на последнюю строку TestProc. Но это неправильно. Искомый адрес дальше
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
008904B0 EBE5             jmp $00890497
008904B2 5F               pop edi
008904B3 5E               pop esi
008904B4 8BE5             mov esp,ebp
008904B6 5D               pop ebp
008904B7 C3               ret   // Выход из TestProc
008904B8 B004             mov al,$04
008904BA 0200             add al,[eax]
008904BC FFFF             db $ff $ff 
008904BE FFFF             db $ff $ff 
008904C0 050000006E       add eax,$6e000000
008904C5 006100           add [ecx+$00],ah
008904C8 6D               insd 
008904C9 006500           add [ebp+$00],ah
008904CC 3100             xor [eax],eax
008904CE 0000             add [eax],al
008904D0 FFFF             db $ff $ff   // Искомый адрес
008904D2 FFFF             db $ff $ff 
008904D4 1B01             sbb eax,[ecx]
008904D6 0000             add [eax],al

...
Рейтинг: 0 / 0
Invalid variant type
    #40003990
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это утилита из EurekaLog Tools Pack. А руками можно по .map файлу посмотреть.
...
Рейтинг: 0 / 0
Invalid variant type
    #40004066
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker
А руками можно по .map файлу посмотреть.
Я писал такую утилиту сам на основании JclDebug. И она также показывает на последнюю строку TestProc
...
Рейтинг: 0 / 0
Invalid variant type
    #40004077
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_

Тикет создал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Invalid variant type
    #40004088
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Тикет создал?
А смысл, если в следующих версиях пофиксили?
...
Рейтинг: 0 / 0
Invalid variant type
    #40004102
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не факт, что пофиксили.

Впрочем, если на следующих версиях не воспроизводится,
то особого смысла создавать нет (если снова не всплывёт).
Разве что подарить пример для соответствующего автотеста.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Invalid variant type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]