Что вызывает Sigtrap в сеансе отладки

В моей программе на С ++ я использую библиотеку, которая будет "отправлять?" Sigtrap на определенные операции, когда Я отлаживаю его (используя gdb в качестве отладчика). Затем я могу выбрать, хочу ли я продолжить или остановить программу. Если я решу продолжить, программа будет работать должным образом, но установка пользовательских точек останова после того, как Sigtrap будет перехвачен, приводит к сбою отладчика / программы.

Итак, вот мои вопросы:

  1. Что вызывает такой Sigtrap? Это оставшаяся строка кода, которую можно удалить, или это вызвано отладчиком, когда он «находит что-то, что ему не нравится»? программа работает без сбоев, когда я компилирую Релиз, а не Отладочную версию?
  2. Что означает Sigtrap?

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

Большое спасибо.

32
задан Community 23 May 2017 в 12:25
поделиться

1 ответ

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

Когда процессор обнаружит событие, он передаст его в ядро, а ядро пошлет SIGTRAP отлаживаемому процессу. Обычно SIGTRAP убивает процесс, но поскольку он отлаживается, отладчик будет уведомлен о сигнале и обработает его, в основном позволяя вам проверить состояние процесса перед продолжением выполнения.

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

Вопрос, который я поместил в поле комментария, выглядит уместным здесь только потому, что Windows на самом деле не посылает SIGTRAP, а сигнализирует о точке останова своим собственным способом. Я предполагаю, что когда вы отлаживаете программы, используются отладочные версии системных библиотек, и убеждаюсь, что обращения к памяти выглядят логичными. Возможно, в вашей программе есть ошибка, которая закрывается бумагой во время выполнения, но на самом деле может вызывать дальнейшие проблемы в других местах.

Я не занимался разработкой под Windows, но, возможно, вы сможете получить более подробную информацию, просмотрев журнал событий Windows

.
38
ответ дан 27 November 2019 в 21:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: