Как работают точки останова в коде C ++? - PullRequest
37 голосов
/ 12 октября 2010

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

Ответы [ 4 ]

37 голосов
/ 12 октября 2010

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

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

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

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

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

Кроме того, некоторые ЦП имеют аппаратную поддержку точек останова, когда вы просто загружаете адрес в некоторый регистр.

8 голосов
/ 12 октября 2010

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

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

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

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

Тем не менее, это будет использоваться только для «опции перехода к текущей строке».

4 голосов
/ 12 октября 2010

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

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

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

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

1 голос
/ 12 октября 2010

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

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

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

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

...