В моей программе на С ++ я использую библиотеку, которая будет "отправлять?" Sigtrap на определенные операции, когда Я отлаживаю его (используя gdb в качестве отладчика). Затем я могу выбрать, хочу ли я продолжить или остановить программу. Если я решу продолжить, программа будет работать должным образом, но установка пользовательских точек останова после того, как Sigtrap будет перехвачен, приводит к сбою отладчика / программы.
Итак, вот мои вопросы:
Это более общий подход к вопросу, который я выложил вчера . и устранение проблем .
Я думаю, что мой вопрос был очень конкретным, и я не хочу, чтобы вы решали мою проблему, но помогите мне (и, надеюсь, другим) понять фон.
Большое спасибо.
В процессорах, поддерживающих точки останова инструкций или точки наблюдения за данными, отладчик попросит процессор следить за доступом инструкций к определенному адресу или чтением/записью данных по определенному адресу, а затем работать на полной скорости.
Когда процессор обнаружит событие, он передаст его в ядро, а ядро пошлет SIGTRAP отлаживаемому процессу. Обычно SIGTRAP убивает процесс, но поскольку он отлаживается, отладчик будет уведомлен о сигнале и обработает его, в основном позволяя вам проверить состояние процесса перед продолжением выполнения.
В процессорах, не поддерживающих точки останова или точки наблюдения, вся отладочная среда, вероятно, выполняется через интерпретацию кода и эмуляцию памяти, что намного медленнее. (Я представляю, что можно сделать умные трюки, установив флаги страничных таблиц для запрета чтения или записи, в зависимости от того, что нужно отловить, и позволив ядру исправить страничные таблицы, подав сигнал отладчику, а затем снова ограничив флаги страниц. Это, вероятно, могло бы поддерживать почти произвольное количество точек наблюдения и точек останова, и работать лишь незначительно медленнее в случаях, когда к точке наблюдения или точке останова обращаются нечасто.)
Вопрос, который я поместил в поле комментария, выглядит уместным здесь только потому, что Windows на самом деле не посылает SIGTRAP, а сигнализирует о точке останова своим собственным способом. Я предполагаю, что когда вы отлаживаете программы, используются отладочные версии системных библиотек, и убеждаюсь, что обращения к памяти выглядят логичными. Возможно, в вашей программе есть ошибка, которая закрывается бумагой во время выполнения, но на самом деле может вызывать дальнейшие проблемы в других местах.
Я не занимался разработкой под Windows, но, возможно, вы сможете получить более подробную информацию, просмотрев журнал событий Windows
.