Skip to content

Условия изменяют указатели открывающих скобок в поле зрения #343

@Santalov

Description

@Santalov

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

Под неожиданным изменением подразумевается, что выполнение текущего шага Рефал-машиной не должно изменять часть поля зрения, находящуюся за пределами первичного активного подвыражения. Но каким-то образом в процессе вычисления условий это происходит, и меняются указатели на скобки активации. Структура поля зрения сохраняется правильной, меняется только расположение в памяти.

Способ повторения следующий:

  1. Добавить печати указателей на открывающие скобки активации, модифицировав файлы отладчика:

Изменить функцию backtrace_option, печатающую стек скобок активации, в src/lib/debug/refalrts-debugger.cpp:1083:

if (skeleton) {
      fprintf(out, "<%s ...> %p\n", function->function_info->name.name, begin);
 } else {

Изменить функцию handle_function_call, обрабатывающую шаг исполнения, в src/lib/debug/refalrts-debugger.cpp:1384:

if (is_debug_stop(begin, callee)) {
    printf(
      "Step #%d; Function <%s ...> %p\n",
      m_vm->step_counter(), callee == 0 ? "" : callee->name.name,
      begin
    );
    if (debugger_loop(begin, end) == refalrts::cExit) {
      return cExit;
    }
}
  1. Пересобрать компилятор Рефала-5λ
  2. Скомпилировать следующую программу:
*$EXTERN True, False

$ENTRY Go {
    e.Any, <And <A> <B>> : True = <Prout 'Done'>;
}

And {
    e.B False e.E = False;
    e.Trues = True;
}

A {
    e.Any = True;
}

B {
    e.Any, <Or <C> <D>>: True = True;
}

Or {
    e.B True e.E = True;
    e.Falses = False;
}

C {
    e.Any = True;
}

D {
    e.Any = True;
}
  1. Создать в папке с исполняемым файлом конфигурационный файл @refal-5-lambda-diagnostics.ini, содержащий стоку enable-debugger = true.
  2. Запустить программу и выполнить команды пошагового отладчика:
break #6
run
backtrace
break ^2
run

В результате точка остановки ^2 будет пропущена.
Выполнив программу по шагам можно увидеть следующую картину:

stopped on step
Step #0; Function < ...> 009afae0
debug>break #6
debug>run
stopped on function breakpoint
Step #6; Function <C ...> 029bbd40
debug>bt
@0   ^0    <C ...> 029bbd40
@1         <D ...> 029bbd70
@2   ^1    <Or ...> 029bbcc0
@3   ^2    <B?1 ...> 029bbca0
@4   ^4    <And ...> 029bbc80
@5   ^5    <Go?1 ...> 029bbc60
debug>step
stopped on step
Step #7; Function <D ...> 029bbd70
debug>
stopped on step
Step #8; Function <Or ...> 029bbcc0
debug>
stopped on step
Step #9; Function <B ...> 029bbcd0
debug>

Как видно, указатель на открывающую скобку активации функции B?1 (тоже самое, что B позже) изменился.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions