OneS icon indicating copy to clipboard operation
OneS copied to clipboard

Остановка при изменении переменной

Open fixinchik opened this issue 4 years ago • 18 comments

Добавить возможность "остановка при изменении переменной".

Все переменные лежат в памяти под конкретными адресами. Предположим, что мы остановились на строчке кода внутри модуля объекта. Выбрали переменную "Отказ" в качестве отслеживаемой. В этот момент конфигуратор запоминает адрес (не имя) переменной в памяти и её значение. И далее, при выполнении каждой строки кода, сравнивает текущее значение с запомненным. Как только значение изменилось, выполнение кода останавливается и мы видим строку, которая привела к изменению перменной.

При этом неважно где именно и под каким именем эта перменная изменилась. Возможно, "Отказ" передали в процедуру общего модуля, где переменная стала называться "ЕстьОшибки". Но в памяти это один и тот же адрес, который и необходимо отслеживать.

fixinchik avatar Sep 06 '21 07:09 fixinchik

Приведи пример. Вот например я хочу выражение "Контрагент.Итог" отслеживать. Программа ушла в вызов метода, куда передалась переменная "Контрагент" под именем "Поставщик". Как ей понимать внутри такого метода что нужно вычислять по такому выражению? Выражение "Контрагент.Итог" она там не сможет вычислить (именно так сейчас работает табло).

tormozit avatar Sep 13 '21 16:09 tormozit

Пусть вычисляет в контексте добавленной строки. Т.е. то что табло работает сейчас так, не означает, что его нельзя улучшить.

fixinchik avatar Sep 13 '21 16:09 fixinchik

Не понял. Какая строка и куда была добавлена?

tormozit avatar Sep 13 '21 16:09 tormozit

Что непонятного в задаче? Нужно отслеживать значение переменной. Переменная может быть привязана к форме или глобальной переменной, возможно к переменной сеанса. Этого достаточно, чтобы после каждого шага программы вычислять, произошли ли изменения переменной.

На практике так часто нужно отслеживать, поменялась ли видимость элемента формы, например

fixinchik avatar Sep 13 '21 19:09 fixinchik

Видимость элемента формы могут изменять и в общем модуле, передав туда форму как параметр. Такое изменение отлавливаться без сложного анализа не сможет.

tormozit avatar Sep 13 '21 19:09 tormozit

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

fixinchik avatar Sep 14 '21 06:09 fixinchik

Подправил описание, чтобы было более понятно

SeiOkami avatar Sep 19 '21 13:09 SeiOkami

Отправлено в чат: https://t.me/e1c_community/57700 Отправлено боту 1С в 16:15

SeiOkami avatar Sep 19 '21 13:09 SeiOkami

Давно хочется такой функционал. Поддерживаю.

240596448 avatar Sep 19 '21 14:09 240596448

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

tormozit avatar Sep 19 '21 14:09 tormozit

Как я вижу реализацию задачи в общем виде. Пользователь задает выражение, при изменении результата вычисления которого нужно остановиться. Отладчик сразу вычисляет его и запоминает значение (не адрес в памяти). Далее интерпретатор после вычисления каждой строки во всех исполняемых далее методах дает отладчику проверить вычисление этого выражения. Если оно вычислилось успешно (без ошибки), то значение сравнивается с эталонным и при неравенстве отладчик останавливает выполнение и передает управление пользователю отладчика. Тут же возникает проблема низкой успешности вычисления выражения, т.к. в других методах переменные проверяемого выражения могут отсутствовать или называться по-другому. Поэтому отладчик вместе с выражением должен запоминать и контекст (уровень) стека, в котором нужно вычислять выражение. Тогда отладчик на каждом шаге должен загружать контекст каждого такого выражения из стека, затем вычислять в нем родные для него проверочные выражения. Кажется что такие операции будут очень затратными и сильно замедлят выполнение программы.

По поводу оперирования адресом в памяти - думаю на такой низкий уровень отладчику не дадут опускаться.

tormozit avatar Sep 19 '21 15:09 tormozit

В Visual Studio только для C++ (он напрямую работает с памятью) доступна точка останова по изменению данных в памяти / data breakpoint / memory change breakpoint - https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/350dyxd0(v=vs.100)?redirectedfrom=MSDN

tormozit avatar Sep 19 '21 15:09 tormozit

В IntelliJ IDEA есть (field) watchpoint - остановка по изменению значения свойства (поля) объекта. изображение

tormozit avatar Sep 19 '21 15:09 tormozit

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

Не буду отсылать вас к Гуглу. Отошлю к SAP: http://abap4.ru/dynamic-abap-debugger.html

fixinchik avatar Sep 19 '21 16:09 fixinchik

@fixinchik спасибо. Позновательно. Но там к сожалению не видна область видимости этой переменной IMAKT_KEY.

tormozit avatar Sep 19 '21 16:09 tormozit

@fixinchik спасибо. Позновательно. Но там к сожалению не видна область видимости этой переменной IMAKT_KEY.

а в чем проблема с областью видимости? Обычно переменная объявляется в контексте формы или модуля. Вот за этим и нужно следить.

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

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

Мешают, как я понимаю, только религиозные соображения скорости.

fixinchik avatar Sep 20 '21 04:09 fixinchik

В плане на платорму 8.3.25 появилась строчка

Отладчик. Остановка по изменению значения переменной

SeiOkami avatar Feb 25 '23 09:02 SeiOkami

Описал возможный вариант реализации тут https://github.com/SeiOkami/OneS/issues/294

tormozit avatar Dec 23 '24 07:12 tormozit