2010-08-13 3 views
29

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

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

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

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

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

+0

Это может объяснить необъяснимые SIGTRAP: http://stackoverflow.com/questions/2307621/does-getting-random-sigtrap-signals-in-mingw-gdb-is-a-sign-of-memory-corruption – sarnold

+0

Информация в этой теме выглядит многообещающей. Библиотека, которую я использую (boost :: filesystem), требует, чтобы статические DLL-файлы также были связаны с программой. Поэтому я предполагаю, что есть проблема со мной, включая неправильный путь, или с использованием неправильных библиотек .... – zitroneneis

ответ

31

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

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

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

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

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

+0

Кулак всего: спасибо за ваш ответ. Это помогло мне понять основную идею Сигтрапов. Я не думаю, что есть проблема с моим кодом, а не потому, что я так хорошо код, но потому, что я могу запустить Sigtrap в программе, состоящей всего из 1 вызова метода в библиотеку ... (и я полагаю, что повышение библиотека вряд ли будет содержать такие недостатки) Возможно, что-то не так с тем, как я связываю статические библиотеки с моим проектом – zitroneneis

1

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

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

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

Смежные вопросы