BACK-IN-TIME Debugger (отладчик с возможностью обратного выполнения программ) Введение. Как известно, значительная часть усилий по разработке программного обеспечения тратится на отладку, то есть на поиск и исправление ошибок в программе. Данная работа посвящена усовершенствованию основного инструмента отладки программ – отладчика. Отладчик – это программа, позволяющая проследить за ходом выполнения другой программы, по шагам просмотреть каждое её действие вплоть до элементарных операций процессора. Однако стандартные отладчики, таких как GDB не позволяют прослеживать действия отлаживаемой программы в обратном направлении. При использовании такого отладчика, после возникновения ошибки, необходимо перезапустить отлаживаемую программу заново, для продолжения отладки. А вдруг при следующем её запуске ошибки не произойдет по каким-то причинам?! А если программа выдает ошибку только после многочасовой работы?! Программисту, использующему стандартный отладчик пришлось бы перезапускать программу заново и в течении всего этого времени заново воспроизводить ситуацию, которая привела к ошибке. Для такой проблемы есть хорошее решение – возможность отладчика, уже столкнувшись с ошибкой в программе, откатить её состояние на несколько шагов назад и продолжить отладку с нужного места. Введение. Как известно, значительная часть усилий по разработке программного обеспечения тратится на отладку, то есть на поиск и исправление ошибок в программе. Данная работа посвящена усовершенствованию основного инструмента отладки программ – отладчика. Отладчик – это программа, позволяющая проследить за ходом выполнения другой программы, по шагам просмотреть каждое её действие вплоть до элементарных операций процессора. Однако стандартные отладчики, таких как GDB не позволяют прослеживать действия отлаживаемой программы в обратном направлении. При использовании такого отладчика, после возникновения ошибки, необходимо перезапустить отлаживаемую программу заново, для продолжения отладки. А вдруг при следующем её запуске ошибки не произойдет по каким-то причинам?! А если программа выдает ошибку только после многочасовой работы?! Программисту, использующему стандартный отладчик пришлось бы перезапускать программу заново и в течении всего этого времени заново воспроизводить ситуацию, которая привела к ошибке. Для такой проблемы есть хорошее решение – возможность отладчика, уже столкнувшись с ошибкой в программе, откатить её состояние на несколько шагов назад и продолжить отладку с нужного места. Постановка задачи. На данный момент, существует несколько отладчиков, позволяющих возвращаться к предыдущему состоянию программы. Например, новый отладчик для C#, Java, JSP, J# и Visual Basic.NET от Omnicore Software для WINDOWS. Также существует отладчик для Objective Caml для UNIX. Все эти отладчики имеют существенный недостаток: они требуют, чтобы программа была откомпилирована в специальные байт-коды. Взять произвольный исполнимый файл и начать с ним работать эти отладчики не могут. Это хоть и упрощает создание отладчика, но зато не позволяет отлаживать приложения, написанные на таких популярных языках программирования, как C/C++ или Pascal. Постановка задачи. На данный момент, существует несколько отладчиков, позволяющих возвращаться к предыдущему состоянию программы. Например, новый отладчик для C#, Java, JSP, J# и Visual Basic.NET от Omnicore Software для WINDOWS. Также существует отладчик для Objective Caml для UNIX. Все эти отладчики имеют существенный недостаток: они требуют, чтобы программа была откомпилирована в специальные байт-коды. Взять произвольный исполнимый файл и начать с ним работать эти отладчики не могут. Это хоть и упрощает создание отладчика, но зато не позволяет отлаживать приложения, написанные на таких популярных языках программирования, как C/C++ или Pascal. Цель работы - создание отладчика, способного выполнять программу в обратную сторону, но не привязанного к какому-либо языку программирования, байт-коду, виртуальной машине или имеющему какие-то иные ограничения подобного рода. Описание программы BIT Debugger. Программа BIT Debugger представляет собой отладчик под операционную систему Linux, обладающий основными функциями любого традиционного отладчика. Программа сделана на основе широко распространенного стандартного отладчика GDB. Главной особенностью отладчика BIT Debugger является возможность отката отлаживаемой программы к предыдущему состоянию. Описание программы BIT Debugger. Программа BIT Debugger представляет собой отладчик под операционную систему Linux, обладающий основными функциями любого традиционного отладчика. Программа сделана на основе широко распространенного стандартного отладчика GDB. Главной особенностью отладчика BIT Debugger является возможность отката отлаживаемой программы к предыдущему состоянию. Помимо стандартных операций, присущих обыкновенному отладчику, BIT Debugger обладает следующими возможностями: - Восстановление более раннего состояния программы, сохраненного вручную, непосредственно в процессе отладки. - Откат программы назад на определенное число строчек исходного кода отлаживаемой программы. Принцип работы команд восстановления состояния. Принцип работы команд восстановления состояния. Идея восстановления предыдущего состояния Дьяченко Василий Санкт-Петербург ЛНМО
программы заключается в клонировании процесса отлаживаемой программы с помощью системного вызова fork() операционной системы Linux. В сохранении и восстановлении одного состояния программы можно выделить следующие этапы: Применение. При разработке программы BIT Debugger, за основу Применение. При разработке программы BIT Debugger, за основу был взят широко распространенный отладчик GDB. Такой подход имеет преимущества: был взят широко распространенный отладчик GDB. Такой подход имеет преимущества: Это дает возможность применять BIT Debugger при отладке программ, написанных на Это дает возможность применять BIT Debugger при отладке программ, написанных на практически любых языках. Результаты получают шанс на практическое использование – их можно будет перенести Результаты получают шанс на практическое использование – их можно будет перенести в стандартный отладчик GDB. Возможность выполнить программу в обратную сторону, реализованную в BIT Debugger, удобно использовать при отладке больших приложений, в которых ошибка возникает после долгой работы. При этом не требуется больших затрат системных ресурсов, так как при клонировании процесса отлаживаемой программы, дополнительная память выделяется только на те части программы, которые изменились после клонирования процесса. Возможность отката программы назад дает программисту большой выигрыш во времени, что позволяет значительно сократить усилия, затрачиваемые на поиск источника возникшей ошибки. PID=6000 код fork() PID=6000 код PID=6001 код PID = 6000 Код программы … BIT Debugger Код программы Код программы... PID = 6000 call fork call wait Испорченный код … … BIT Debugger Код программы Код программы... PID=6000 call fork call wait … BIT Debugger PID=6001 call wait call fork …Код программы Код программы... ParentChild PID=6000 call fork call wait … BIT Debugger PID=6001 код …Код программы Код программы... ParentChild PID=6001 код … BIT Debugger fork: PID=6000 call fork call wait … BIT Debugger PID=6001 код …Код программы Код программы... ParentChild 1 СОХРАНЕНИЕ: ЗАГРУЗКА: PID=6000 код …Код программы Код программы... Parent 2 PID = 6000 Код программы … BIT Debugger 3 Это дает возможность сохранить одно состояние программы и позже загрузить его. Повторяя данную операцию несколько раз, можно получить необходимое число точек восстановления. Затем можно восстановить любое из сохраненных ранее состояний программы. temp.c Исходный код программы PID=6000 call fork call wait … PID=6001 call fork call wait … Сохраненное состояние программы (на строке 1) Сохраненное состояние программы (на строке 5) Это состояние нужно загрузить (строка 3) Исходный код программы Эта строка на данный момент выполняется. (строка 6) 1 2 3