Подтвердить что ты не робот

Как контрольные точки работают в коде С++?

Как работают контрольные точки в коде на С++? Являются ли они специальными инструкциями, вставленными между некоторыми инструкциями ассемблера при компиляции кода? Или есть что-то еще? Кроме того, как реализован сквозной код? Точно так же, как точки останова...?

4b9b3361

Ответ 1

Это сильно зависит от процессора и отладчика.

Например, одно из возможных решений для процессора x86:

  • Вставить однобайтную инструкцию INT3 в нужное место
  • Подождите, пока не удастся получить исключение точки останова
  • Сравните адрес исключения с списком точки останова, чтобы определить, какой из них
  • Выполнение действий точки останова
  • Замените INT3 на исходный байт и переключите отлаженный процесс в режим трассировки (пошаговое выполнение инструкций CPU)
  • Продолжить отлаженный процесс
  • Сразу же вы поймаете исключение отслеживания - инструкция была выполнена
  • Положите INT3 назад

Точки наблюдения могут быть реализованы аналогичным образом, но вместо INT3 вы помещаете страницу памяти, где наблюдаемая переменная находится в режиме только для чтения или в режиме без доступа, и ожидайте исключения сегментации.

Шаг через сборку также можно выполнить с помощью режима трассировки. Переход по исходным строкам также может быть сделан путем размещения точек останова на следующих инструкциях на основе данных отладки.

Также у некоторых процессоров есть аппаратная поддержка точки останова, когда вы просто загружаете адрес в какой-то регистр.

Ответ 2

Согласно этой записи в блоге на technochakra.com вы правы:

Контрольные точки программного обеспечения работают, вставляя специальную инструкцию в отлаживаемой программе. Эта специальная инструкция на платформе Intel "int 3". При выполнении она вызывает обработчик исключений отладчиков.

Я не уверен, каким образом выполняется переход к следующей инструкции или над ней. Однако в статье добавляется:

По практическим соображениям неразумно запрашивать перекомпиляцию всякий раз, когда точка останова добавляется или удаляется. Отладчики меняют загруженное изображение исполняемого файла в памяти и вставляют команду "int 3" во время выполнения.

Однако это будет использоваться только для параметра "выполнить текущую линию".

Ответ 3

Единый степпинг реализуется на уровне (ассемблер) кода не на уровне С++. Отладчик знает, как сопоставить строки кода С++ с кодовыми адресами.

Существуют различные реализации. Существуют процессоры, поддерживающие отладку с регистрами точек останова. Когда выполнение достигает адреса в регистре точек останова, CPU выполняет исключение точки останова.

Другой подход заключается в исправлении кода для времени выполнения с помощью специальной команды, в лучшем случае однобайтовой инструкции. В x86-системах, которые обычно int 3.

Первый подход позволяет использовать точки останова в ПЗУ, а второй позволяет одновременно получать больше точек останова.

Ответ 4

AFAIK все отладчики (для любого компилируемого языка), которые допускают неограниченное количество точек останова, используют вариант замены инструкции, которая должна быть проверена с помощью специального значения (как описано выше), и сохраняя список мест, где были размещены эти значения,

Когда процессор пытается выполнить один из этих специальных значений, возникает исключение, отладчик ловит его и проверяет, находится ли адрес исключения в списке контрольных точек. Если это так, отладчик вызывается, и пользователю предоставляется возможность взаимодействовать. Если это НЕ, то исключение происходит из-за того, что было в программе с самого начала, и отладчик разрешает исключение "передавать" любому обработчику ошибок.

Обратите также внимание на то, что отладка самомодифицирующего кода может завершиться неудачно, потому что отладчик мгновенно изменяет сам код. (Конечно, никто бы никогда не писал самомодификацию, теперь они? > ; -)

По этим причинам важно, чтобы отладчику была предоставлена ​​возможность удалить все контрольные точки, которые он устанавливает, до завершения сеанса отладки.