Крах отладчика при передаче параметров
Оформил: 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-параметр.
|