Автор фото: Иван Андреев
Я уверен, что у многих читателей при отладке приложений периодически возникает желание отступить на шаг (или два, десять…) назад от текущей строки, чтобы увидеть причины происходящего. Чаще всего ради этого приходится перезапускать отладку с начала и пытаться поймать исполнение чуть раньше
Сначала немного философии. Зачем вообще нужно прямое, т.е. «нормальное» прямое исполнение программ? Чтобы получить результат некоторого вычисления, который нежелательно/трудно/невозможно выполнять вручную. Расчёт полёта ракеты — это вычисления. Просмотр котиков на сайте — это вычисления. Процесс вычисления может быть формализован с помощью представления его в форме алгоритма.
Для чего это нужно
Для чего может понадобиться исполнение обратное? Для того, чтобы помочь понять, почему вычисления привели к тому или иному результату.
Поддержку функциональности обращения течения программы возможно включать в различные инструменты, используемые программистами. Далее в основном речь пойдёт об её реализации в симуляторах. В этом контексте эта идея получает два варианта развития. Первое — это отладка исполняющегося внутри модели кода симулируемого BIOS/Firmware, ОС, приложения…, что интересно конечному пользователю симулятора — разработчику ПО. Второе применение — это отладка непосредственно симулятора (он тоже является программой). Это важно уже для разработчика моделей устройств, участвующих в процессе моделирования.
Отладка
Теперь немного формализации.
Исполнение любого алгоритма (в традиционном понимании этого термина), записанного в той или иной форме, можно разбить на отдельные шаги, буде то операторы языка высокого уровня, машинные инструкции, движения каретки машины Тьюринга и т.п. Процесс отладки начинается с поиска шага в реализации алгоритма, на котором что-то пошло не так, как ожидалось программистом. Как правило при этом известно две точки в исполнении: на первой состояние всё ещё «хорошее», ожидаемое, а во второй уже наблюдается некорректное поведение или состояние.
![](http://habr.habrastorage.org/post_images/c29/b77/cf8/c29b77cf820b282c2568d8c1d6118620.png)
Необходимо минимизировать расстояние между точками с известным «хорошим» и «плохим» состоянием до одного шага. Этот поиск можно проводить по-разному. Например, линейным образом перебирать все шаги внутри отрезка, каждый раз стартуя из начала алгоритма.
![](http://habr.habrastorage.org/post_images/3af/7f5/419/3af7f54190e7352fdfc3c9687c8e6214.png)
Это оправдано, только если сам отрезок очень короткий.
Можно прибегнуть к дихотомии, сокращая длину отрезка в два раза.
![](http://habr.habrastorage.org/post_images/eb2/881/8de/eb28818de22faacb6ee07d751cd4e7e1.png)
Число итераций при этом будет существенно меньше, чем при линейном переборе. Однако осталась необходимость каждый раз перезапускать программу сначала. Хорошо, если при этом баг проявляет себя сразу после старта. А если до его возникновения проходит несколько часов?
Отладка в симуляции
Как симуляция может помочь с отладкой? Выделю два приёма, которые, как будет показано далее, тесно связаны друг с другом.
Создание точек сохранения. Симулятор позволяет сохранить состояние всех моделей устройств: содержимое памяти, регистров ЦПУ и устройств, — на диск в виде файла. Затем из такой точки сохранения (англ. checkpoint или savepoint) можно неоднократно восстанавливать сценарий исполнения, экономя время на «добегании» от начала программы к интересующему региону. Я уверен, что читающие это игроки в компьютерные игры не раз пользовались механизмом сохранений для того, чтобы не начинать сложный уровень сначала.
Обращение времени. Перезапуск симуляции из точки сохранения необходим, если обнаружено, что в процессе поиска мы переступили точку возникновения проблемы, и она уже проявилась. Вот было бы здорово, если бы можно было отойти на несколько шагов назад! И симуляция позволяет это делать!
Поиск точки с ошибкой при отладке под управлением симулятора выглядит примерно так:
![](http://habr.habrastorage.org/post_images/945/77c/0ee/94577c0eef5c4b43211cd8d995048d61.png)
Требования на симуляцию
Далеко не все процессы в реальном мире можно обратить вспять. Каждый, кто пытался вдавить зубную пасту обратно в тюбик, подтвердит это. Поэтому и не в каждой симуляции это возможно: требуются некоторые гарантии от программных моделей и усилия от их авторов.
Возможность инспектирования состояния модели
Для создания точек сохранения, пригодных для последующего восстановления, каждая входящая в симуляцию модель устройства должна уметь достаточно детально представлять своё внутреннее состояние в некотором формате. Кроме архитектурного состояния (регистры, память) требуется знать о том, как отдельные устройства соединялись друг с другом.
Некоторые элементы модели можно не сохранять, если они не отражают архитектуру представляемого ею устройства и могут быть однозначно восстановлены в будущем. Например, содержимое кэшей симулятора (но не кэшей моделируемого устройства!) используется только для ускорения работы модели и потому чаще всего может быть отброшено при сохранении. Кроме того, при восстановлении симуляции необходимо гарантировать, что такие кэши не будут содержать устаревшей информации, связанной с архитектурным состоянием модели до восстановления.
Детерминистичность
Под этим странным словом подразумевается повторяемость исполнения некоторого процесса для любых двух его прогонов с одинаковым исходным состоянием. Для однопоточной программы повторяемость считается чем-то само собой разумеющимся, при условии, что она работает без использования внешних генераторов случайных последовательностей и не имеет ошибок типа «обращение к неинициализированным данным». Для параллельных приложений повторяемость также возможна, но требует особенно аккуратного программирования.
Детерминистичность в сочетании с точками сохранения позволяет реализовать обратное исполнение.
Реализация
Боремся с неповторяемостью
Пример такого источника — человек. То есть оператор, взаимодействующий с компьютером и нажимающий кнопки на клавиатуре тогда, когда ему вздумается. Естественно, ни о какой воспроизводимости с его стороны надеяться не приходится.
Пример использования
Для Wind River Simics
Видео
ссылка на оригинал статьи http://habrahabr.ru/company/intel/blog/206052/
Добавить комментарий