В разработке программного обеспечения точка останова — это преднамеренная остановка или пауза в программе , устанавливаемая в целях отладки . Иногда ее также называют просто паузой .
В более общем смысле, точка останова — это средство получения знаний о программе во время ее выполнения. Во время прерывания программист проверяет тестовую среду ( регистры общего назначения , память , журналы, файлы и т. д.) , чтобы выяснить, функционирует ли программа так, как ожидалось. На практике точка останова состоит из одного или нескольких условий, которые определяют, когда выполнение программы должно быть прервано.
Точки останова были изобретены для ENIAC , одного из самых ранних цифровых компьютеров, программистом Бетти Холбертон . [1] В первоначальной конструкции ENIAC поток программы устанавливался путем подключения кабелей от одного блока к другому. Чтобы остановить программу в определенной точке, кабель удалялся, называясь точкой останова . [2]
Ранние мэйнфреймы, такие как IBM/360 , имели консольные переключатели/диски, которые позволяли устанавливать точки останова на определенных адресах хранения инструкций и обеспечивали работу в режиме «одиночного цикла», позволяя непосредственно наблюдать содержимое регистров и памяти на индикаторах консоли. Появление многозадачности ограничило использование этой опции, поскольку вся машина была остановлена.
Программисты использовали патчи машинного кода для реализации отдельных разрушительных точек останова, чтобы вызвать дамп ядра , с первых дней компьютеров. Дамп ядра предоставлял состояние регистров и памяти в точный момент преднамеренного «сбоя».
Появление телетайпных консолей в 1960-х годах позволило расширить возможности интерактивной отладки командной строки , но только в начале 1970-х годов и с появлением повсеместных видеомониторов, подключенных к мэйнфреймам , полностью интерактивная, полноэкранная отладка в многозадачных средах стала реальностью. Это также позволило выполнять программу пошагово в истинном стиле анимации программы с одновременным отображением дополнительных изменений регистра и памяти. Первоначально этот тип анимации находился на уровне дизассемблированного или декомпилированного машинного кода, но позже перешел на уровень анимации исходного кода HLL .
Точки останова чаще всего используются для прерывания работающей программы непосредственно перед выполнением указанной программистом инструкции . Это часто называют точкой останова инструкции .
Также могут использоваться другие виды условий, такие как чтение, запись или изменение определенного местоположения в области памяти. Это часто называют точкой останова данных или точкой наблюдения . Многие системы также поддерживают точки останова, которые активны только при выполнении условия (например, когда переменная имеет определенное значение), обычно называемые условной точкой останова . [3]
При достижении точки останова используются различные инструменты для проверки состояния программы или ее изменения. Трассировка стека каждого потока может использоваться для просмотра цепочки вызовов функций , которые привели к приостановленной инструкции. Список наблюдателей позволяет просматривать значения выбранных переменных и выражений . Также могут быть инструменты для отображения содержимого регистров , загруженных программных модулей и другой информации.
Точка журнала — это тип точки останова, которая только печатает (или «регистрирует» ) информацию, а не прерывает выполнение. Обычно разработчик может указать сообщение и/или значения переменных для печати, когда выполнение достигает определенной точки. [4] Точки журнала — это альтернатива помещению операторов журналирования в отлаживаемую программу (иногда называемую отладкой printf ), и они особенно полезны, когда изменение программы нецелесообразно (например, при отладке внешней библиотеки, вызываемой программой).
Многие процессоры включают аппаратную поддержку точек останова (обычно точек останова инструкций и данных). Например, архитектура набора инструкций x86 обеспечивает аппаратную поддержку точек останова с помощью своих регистров отладки x86 . Такое оборудование может включать ограничения, например, не разрешая точки останова на инструкциях, расположенных в слотах задержки ветвления . Этот тип ограничений накладывается микроархитектурой процессора и различается от процессора к процессору.
Без аппаратной поддержки (и в многозадачных средах) отладчикам приходится реализовывать точки останова в программном обеспечении. Для точек останова инструкций это сравнительно простая задача замены инструкции в месте точки останова на:
Эту технику может быть сложнее реализовать в многозадачных системах, использующих общее хранилище программ (прерывание может произойти в другом потоке, требуя восстановления исходной инструкции для этого потока). Кроме того, если программа находится в защищенной памяти, перезапись инструкций может быть предотвращена.
В качестве альтернативы,
Некоторые отладчики позволяют изменять регистры или переменные программы в памяти перед возобновлением, что фактически позволяет вводить «ручные» временные назначения для целей тестирования. Аналогично, инструкции программы часто можно пропустить, чтобы определить влияние изменений на логику программы, что позволяет отвечать на вопросы о выполнении программы напрямую (т. е. без предположений или догадок). Во многих случаях это может быть единственным практичным методом тестирования неясных «событийно-управляемых» подпрограмм ошибок, которые редко, если вообще когда-либо, выполняются, без дополнительного риска оставить временные изменения исходного кода. Ручное изменение местоположения возобновления в приостановленной программе может использоваться для входа в иным образом редко выполняемый раздел кода (например, конкретный обработчик состояния оборудования).
Однако реализация точек останова данных в программном обеспечении может значительно снизить производительность отлаживаемого приложения, поскольку оно использует дополнительные ресурсы на том же процессоре. [5] Однако это обычно приемлемо во время тестирования, и объем информации, доступной от отладчика, не ограничивается ограничениями отладочных данных, известных оборудованию. Например, программная реализация может собирать данные логического пути на уровне программы/подпрограммы/инструкции, чтобы значительно увеличить то, что может храниться конкретной аппаратной платформой для проверки. Метод моделирования набора инструкций значительно снижает накладные расходы по сравнению с методом (повторной) замены инструкций, а также уменьшает промахи кэша .
Некоторые реализации языков программирования предоставляют свои отладочные функции для использования другими программами. Например, некоторые диалекты FORTRAN имеют AT
оператор, который изначально предназначался для работы в качестве точки останова инструкции. Python реализует отладчик, доступный из программы Python. [6]
Эти возможности могут быть и [7] используются не по назначению для работы в качестве оператора COMEFROM .