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

Как работает точка останова в отладчике?

Точки останова - одна из самых крутых функций, поддерживаемых большинством популярных отладчиков, таких как GDB. Но как работает точка останова? Какие модификации кода делают компилятор для достижения точки останова? Существуют ли специальные аппаратные функции, используемые для поддержки контрольных точек?

4b9b3361

Ответ 1

Компилятор не должен "модифицировать" двоичный файл каким-либо образом, чтобы поддерживать точки останова. Однако важно, чтобы:

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

Остальная работа затем выполняется самим отладчиком.

  • Контрольные точки программного обеспечения необязательно нуждаются в специальных аппаратных функциях. Отладчик здесь использует модификацию исходного двоичного файла (это копия, загружаемая в память). Когда вы устанавливаете точку останова, отладчик будет размещать специальную инструкцию в месте точки останова. Эта специальная инструкция должна каким-то образом позволить отладчику обнаруживать, когда он (эта специальная инструкция) выполняет. Это может быть некоторая инструкция, которая вызывает какое-то прерывание/исключение, которое может использовать отладчик, или какая-либо инструкция, которая обрабатывает элемент управления для отладки. Если это работает под некоторыми ОС, эта ОС должна поддерживать изменение текущей программы (с чем-то вроде ptrace poke/peek). Недостатком точек останова SW является то, что отладчик должен иметь возможность изменять запущенную программу, что невозможно, если программа работает из какой-то постоянной памяти (довольно распространенной во встроенном мире).
  • Аппаратные точки останова (которые должны поддерживаться процессором) реализуют аналогичное поведение без изменения двоичного кода программы. Это зависит от процессора, но обычно он позволяет вам хотя бы определить адрес программы, при котором выполнение должно попасть в точку останова. CPU постоянно сравнивает текущий ПК с этими адресами точки останова, и после согласования условия он прерывает выполнение. Количество этих точек останова всегда ограничено.

Ответ 2

Чтобы сначала поставить точку прерывания, мы должны добавить некоторую специальную информацию в двоичный файл. Мы используем флаг -g, компилируя исходные файлы c, чтобы включить эту информацию. Программный отладчик фактически использует эту информацию для установки точек останова. Лучший пример поддержки аппаратного прерывания - это VxWorks, как я уже испытал. В принципе, в точке останова процессор останавливается. Таким образом, внутри любой точки, которая даст исключение процессору, можно использовать точку разрыва программного обеспечения. В то время как точка отказа оборудования работает, сопоставляя адрес, хранящийся в регистрах оборудования, чтобы вызвать исключение. Аппаратная точка разлома очень мощная, но она сильно зависит от архитектуры.

Очень хорошее объяснение здесь В чем разница между контрольными точками оборудования и программного обеспечения? Здесь дается хорошее введение с информацией о процессоре http://processors.wiki.ti.com/index.php/How_Do_Breakpoints_Work