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

Что вызывает сигстрап в сеансе отладки

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

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

  • Что вызывает такой сигстрап? Это остаточная строка кода, которая может быть удалена или вызвана отладчиком, когда он "находит что-то, что ему не нравится"?
  • Сигстрап, вообще говоря, плохой, и если да, то почему программа работает безупречно, когда я компилирую Release, а не Debug Version?
  • Что указывает Сигтрап?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Во время работы в Eclipse с компилятором minGW/gcc я понял, что он очень плохо реагирует с векторами в моем коде, что приводит к нечеткому сигналу SIGTRAP и иногда даже показывает ненормальное поведение отладчика (то есть прыгает где-то в коде и продолжает выполнять код в обратном порядке!).

Я скопировал файлы из моего проекта в VisualStudio и разрешил проблемы, затем скопировал изменения обратно в eclipse и voila, работал как шарм. Причины были похожи на различия в инициализации векторов с функциями reserve() и resize() или пытались получить доступ к элементам из границ векторного массива.

Надеюсь, это поможет кому-то другому.