Трассировка программы — это получение информации о трассе выполнения программы.
Трасса выполнения — это последовательность действий с теми фактическими значениями данных, которые производились при выполнении программы исполнителем и промежуточные состояния в которых находился исполнитель программы в результате выполнения каждого действия.
Итак:
- трасса выполнения программы определяется входными данными программы,
- трасса выполнения описывается последовательностью того:
- какие действия выполнялись и с какими фактическими значениями данных,
- каким в результате выполнения каждого действия становилось состояние исполнителя.
В зависимости от входных данных, то есть от тех данных, которые получает исполнитель программы на вход (считывая их из пользовательского ввода, из файла, из сетевого соединения или откуда-то ещё), могут получаться разные трассы выполнения программы.
Таким образом, текущее состояние исполнителя программы и набор входных данных, ещё не считанный исполнителем, полностью определяет дальнейшее выполнение программы, то есть все дальнейшие действия исполнителя.
В отличие от программы, где могут быть ветвления и циклы, трасса выполнения линейна, то есть не содержит каких-либо ветвлений, так как при выполнении программы выполнение каждого ветвления приводит к однозначному выбору следующей команды программы.
Какие-то действия, описанные в программе, могут вообще не войти в какую-то трассу выполнения программы. Какие-то действия могут войти в трассу выполнения программы несколько раз, возможно, с разными использованными в них значениями данных.
В случае, когда исполнителем является компьютер, состояние исполнителя — это состояние памяти компьютера, относящейся к программе. Можно считать, что это состояние описывается текущими значениями всех переменных программы и тем, какая команда выбрана для выполнения в качестве следующей.
Для того, чтобы произвести трассировку программы "вручную", необходимо воспроизвести работу исполнителя программы. Для этого удобно предварительно составить блок-схему программы, а затем, в соответствии с ней, произвести вычисления, записывая каждое фактическое вычисление с фактическими данными и состояние памяти программы после него.