Илья Ермаков писал(а):
Это ошибка при сборке мусора. У Вас нарушена структура памяти.
Где-то "переиграно" с SYSTEM, возможно?
Это от прежних структур данных (до вызова запроса с BLOB)?
Я попробовал в LinKernel заменить ассемблерную вставку на закоментированный код на КП
Код:
PROCEDURE Next (b: Block): Block; (* next block in same cluster *)
VAR size: INTEGER;
BEGIN
SYSTEM.GET(SYSTEM.VAL(INTEGER, b.tag) DIV 4 * 4, size);
IF ODD(SYSTEM.VAL(INTEGER, b.tag) DIV 2) THEN INC(size, b.last - SYSTEM.ADR(b.last)) END;
RETURN SYSTEM.VAL(Block, SYSTEM.VAL(INTEGER, b) + (size + 19) DIV 16 * 16)
END Next;
(*
PROCEDURE [code] Next (b: Block): Block (* next block in same cluster *)
(*
MOV ECX,[EAX] b.tag
AND CL,0FCH b.tag DIV * 4
MOV ECX,[ECX] size
TESTB [EAX],02H ODD(b.tag DIV 2)
JE L1
ADD ECX,[EAX,4] size + b.last
SUB ECX,EAX
SUB ECX,4 size + b.last - ADR(b.last)
L1:
ADD ECX,19 size + 19
AND CL,0F0H (size + 19) DIV 16 * 16
ADD EAX,ECX b + size
*)
08BH, 008H,
080H, 0E1H, 0FCH,
08BH, 009H,
0F6H, 000H, 002H,
074H, 008H,
003H, 048H, 004H,
029H, 0C1H,
083H, 0E9H, 004H,
083H, 0C1H, 013H,
080H, 0E1H, 0F0H,
001H, 0C8H;
*)
[/code]
Теперь на самый верх выходит Kernel.Next
[code]
****
* BlackBox
* illegal memory read [ad = 00000000]
- Kernel.Next (pc=00002049, fp=BFAAF0E0)
- Kernel.CheckCandidates (pc=000021E0, fp=BFAAF10C)
- Kernel.MarkLocals (pc=000023BE, fp=BFAAF128)
- Kernel.FastCollect (pc=0000286F, fp=BFAAF138)
- Kernel.NewBlock (pc=00002A6C, fp=BFAAF15C)
- Kernel.NewArr (pc=00000BFC, fp=BFAAF188)
- FibDriver.SetCacheSize (pc=000004CC, fp=BFAAF1B0)
- FibDriver.InitCache (pc=00000576, fp=BFAAF1C4)
- FibDriver.Driver.EndExec (pc=00002A78, fp=BFAAF1E8)
- FibSqlDB.DoEndExec (pc=00002419, fp=BFAAF210)
- FibSqlDB.StdTable.Exec (pc=000029BA, fp=BFAAF2A8)
- MyjfsLinFiles.WriteNewFile (pc=00000331, fp=BFAAF2F8)
****
Segmentation fault