Крах отладчика при передаче параметров

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: Александр Малыгин

type

TBTZ = packed record

case integer of

0: (BTZ1: array[0..6] of byte;

BTZ2: array[0..1] of byte;

BTZ3: array[0..1] of byte;

BTZ4: array[0..2] of byte);

1: (BTZW, BTZH: array[0..6] of byte);

2: (BTZ: array[0..13] of byte);

end;

TPrmTS = packed record

PrmC, PrmN: array[0..3] of TBTZ;

end;

procedure Stone(var P: TPrmTS);

begin

// …

end;

При прогоне без остановки никаких сбоев не происходит. Если сделать шаг или отпустить на выполнение внутри процедуры, отладчик тихо исчезает вместе с приложением, без каких либо сообщений. Проблема не проявляется, если записи не packed, либо если TPrmTS содержит только одно поле, либо если массивы PrmC,PrmN состоят из менее 4 элементов. Манипуляции с размерами массивов и вставкой дополнительных полей в TBTZ перед case приводят к разным результатам:

ничего не происходит;

исключение Access Violation;

исключение Privileged Instruction.

В последних двух случаях аналогичное сообщение возникает при закрытии приложения, отладчик не может выйти из режима отладки и приходится перезагружать Delphi.

РЕШЕНИЕ: Передавать проблемный тип как нетипизированный var-параметр.

{/codecitation}

Добавить комментарий