Как реализовать / установить точку останова данных? - PullRequest
2 голосов
/ 08 мая 2011

Требования:

Мне нужно создать прерывание, когда ячейка памяти изменяется или записывается. Из ISR я могу вызвать синий экран, который дает мне хорошую трассировку стека с именами методов.

Подходы:

  • Проверка значения в таймере ISR. Очевидно, что это не дает удовлетворительных результатов.
  • Я обнаружил виртуальную машину bochs . Он имеет встроенный отладчик, который может устанавливать точки останова данных и останавливать программу. Но я не могу создать прерывание в этот момент.
  • bochs позволяет подключить к нему GDB. Я не смог собрать его с поддержкой GDB.

Другие мысли:

  • своего рода прерывание «инструкция предварительного просмотра», которое срабатывает для каждой инструкции перед ее выполнением. Набор используемых инструкций по записи в память должен быть довольно управляемым, но я думаю, что это все равно будет PITA для извлечения адреса. И я думаю, что такого прерывания нет.
  • Вид прерывания «Предварительный доступ к памяти». Опять же, я не думаю, что это там.
  • Злоупотребление подкачкой. Отметьте интересующую страницу как отсутствующую и проверьте адрес в обработчике ошибок страницы. Все равно придется различать операции чтения и записи, и я думаю, что обработчик ошибок страницы не знает точного адреса, просто номер страницы.

1 Ответ

6 голосов
/ 08 мая 2011

См. Главу 16 в Руководстве разработчика программного обеспечения Intel , том 3A .Он предоставляет информацию об использовании регистров отладки, которые, помимо прочего, поддерживают создание исключения отладчика при доступе к определенному адресу.Прерывание сработает после инструкции, которая его вызвала.В частности, вам придется установить один из dr0-dr3 по адресу, который вы хотите просмотреть, и dr7 с правильными значениями, чтобы сообщить процессору, какие типы обращений должны вызывать прерывание.

...