Что вызывает Sigtrap в сеансе отладки - PullRequest
31 голосов
/ 13 августа 2010

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

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

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

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

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

Ответы [ 2 ]

37 голосов
/ 13 августа 2010

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

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

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

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

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

3 голосов
/ 03 июня 2015

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

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

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

...