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