kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Ankur Sethi
Ankur Sethi
Вопрос

Запуск приложения в GDB до тех пор, пока не произойдет исключение

Я работаю над многопоточным приложением и хочу отладить его с помощью GDB.

Проблема в том, что один из моих потоков продолжает умирать с сообщением:

pure virtual method called
terminate called without an active exception
Abort

Я знаю причину этого сообщения, но понятия не имею, где в моем потоке оно возникает. Отслеживание было бы очень полезно.

Когда я запускаю свое приложение в GDB, оно приостанавливается каждый раз, когда поток приостанавливается или возобновляется. Я хочу, чтобы мое приложение продолжало работать нормально, пока один из потоков не умрет с этим исключением, в этот момент все должно остановиться, чтобы я мог получить обратную трассировку.

98 2009-07-12T06:41:03+00:00 3
 BЈовић
BЈовић
Редактировал вопрос 4-го февраля 2013 в 7:37
Программирование
polymorphism
debugging
c++
gdb
multicore
Решение / Ответ
 Dan
Dan
12-го июля 2009 в 1:53
2009-07-12T13:53:15+00:00
Дополнительно
Источник
Редактировать
#9253501

Вы можете попробовать использовать "точку захвата" (catch throw), чтобы остановить отладчик в точке, где генерируется исключение.

Следующая выдержка из руководства gdb описывает функцию catchpoint.


5.1.3 Установка точек захвата

Вы можете использовать точки перехвата, чтобы заставить отладчик останавливаться при определенных видах программных событий, таких как исключения C++ или загрузка разделяемой библиотеки. Для установки точки перехвата используйте команду catch.

  • catch event

    Остановиться, когда произойдет событие. событием может быть любое из следующих:

    • throw

      Выбрасывание исключения из C++.

    • catch

      Перехват исключения C++.

    • exec

      Вызов команды exec. В настоящее время это доступно только для HP-UX.

    • fork

      Вызов команды fork. В настоящее время это доступно только для HP-UX.

    • vfork

      Вызов vfork. В настоящее время это доступно только для HP-UX.

    • load or load libname

      Динамическая загрузка любой разделяемой библиотеки или загрузка библиотеки libname. В настоящее время это доступно только для HP-UX.

    • выгрузить или выгрузить libname

      Выгрузка любой динамически загруженной разделяемой библиотеки или выгрузка библиотеки libname. В настоящее время это доступно только для HP-UX.

  • tcatch событие

    Устанавливает точку захвата, которая включается только для одной остановки. Точка перехвата автоматически удаляется после первого перехвата события.

Используйте команду info break для получения списка текущих точек перехвата.

В настоящее время существуют некоторые ограничения на обработку исключений C++ (catch throw и catch catch catch) в GDB:

  • Если вы вызываете функцию в интерактивном режиме, GDB обычно возвращает вам управление, когда функция завершает выполнение. Однако если вызов вызывает исключение, он может обойти механизм, возвращающий управление, и привести к прерыванию работы программы или просто к продолжению выполнения до тех пор, пока она не попадет в точку останова, не поймает сигнал, который прослушивает GDB, или не выйдет из программы. Это произойдет, даже если вы установите точку перехвата для исключения; точки перехвата исключений отключены в интерактивных вызовах.

  • Вы не можете вызвать исключение в интерактивном режиме.

  • Вы не можете установить обработчик исключений в интерактивном режиме.

Иногда catch - не лучший способ отладки обработки исключений: если вам нужно точно знать, где именно возникло исключение, лучше остановиться до вызова обработчика исключений, так как в этом случае вы сможете увидеть стек до того, как произойдет разворачивание. Если вместо этого установить точку останова в обработчике исключений, может быть нелегко выяснить, где было вызвано исключение.

Чтобы остановиться непосредственно перед вызовом обработчика исключений, вам нужно знать реализацию. В случае GNU C++ исключения вызываются путем вызова библиотечной функции __raise_exception, которая имеет следующий интерфейс ANSI C:

/* addr is where the exception identifier is stored.
   id is the exception identifier.  */
void __raise_exception (void **addr, void *id);

Чтобы отладчик перехватывал все исключения до того, как произойдет разворачивание стека, установите точку останова на __raise_exception (см. раздел Точки останова, точки наблюдения и исключения).

С помощью условной точки останова (см. раздел Условия останова), которая зависит от значения id, вы можете остановить свою программу при возникновении определенного исключения. Вы можете использовать несколько условных точек останова, чтобы остановить программу при возникновении любого из нескольких исключений.

Cassio Neri
Cassio Neri
Редактировал ответ 13-го сентября 2019 в 9:13
142
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
Steve Folly
Steve Folly
12-го июля 2009 в 7:57
2009-07-12T07:57:13+00:00
Дополнительно
Источник
Редактировать
#9253500

Установите точку останова на __pure_virtual

5
0
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
Jeffrey Hill
Jeffrey Hill
28-го августа 2014 в 10:31
2014-08-28T22:31:39+00:00
Дополнительно
Источник
Редактировать
#9253502

FWIW, по-видимому, в gcc 4.1 имя соответствующей функции изменилось, и необходимо установить точку останова в этой функции.

__cxa_pure_virtual

4
0
Похожие сообщества 9
pro.cxx
pro.cxx
6 522 пользователей
C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. No Ads, offtop, flood 2. Полные правила тут https://t.me/ProCxx/259155 Объявления о вакансиях,эвентах - в лс @AlexFails или @MasterZiV
Открыть telegram
supapro.cxx
supapro.cxx
5 407 пользователей
Чат для тех, кто немного знает C++, простые вопросы по C++, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат-флудилка — @fludpac /прогерские вопросы – @pro_prog 🚫flood, pron, spam; ✅УВАЖАЙТЕ ДРУГ ДРУГА!
Открыть telegram
Чат конференции C++ Russia
Чат конференции C++ Russia
1 259 пользователей
Канал конференции: @cpprussia_channel Ближайшая конференция — C++ Russia 2024, анонс дат будет позднее О С++ Russia 2023: https://tinyurl.com/CPPRussia2023 YouTube-канал: https://www.youtube.com/channel/UCJ9v015sPgEi0jJXe_z Саппорт: @JUGConfSupport_bot
Открыть telegram
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
Хирьянов Т.Ф., Алгоритмы и структуры данных (С++)
1 215 пользователей
Лекции: www.youtube.com/playlist?list=PLRDzFCPr95fL_5Xvnufpwj2uYZnZBBnsr Практика: cs.mipt.ru/cpp_algo Спонсировать: www.paypal.me/tkhirianov Онлайн компилятор https://godbolt.org
Открыть telegram
Android NDK (C++) — русскоговорящее сообщество
Android NDK (C++) — русскоговорящее сообщество
836 пользователей
Общаемся на темы, посвященным Android-разработке на C++. Обмен новостями, опытом и наработками. + Про Android: @android_ru + Про iOS: @ios_ru + Канал Android: @pandroidtoday_ru + Вакансии: @mobile_jobs Рекомендуем отключить уведомления.
Открыть telegram
C++ для самых маленьких и отчаяных
C++ для самых маленьких и отчаяных
527 пользователей
Лоу левел (по среднему IQ участников) чатик По продвижению вакансий писать @vertver Флудилка чата - @hckcxx
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Александр Македонский
Зарегистрирован 6 дней назад
2
Andrei Kalinin
Зарегистрирован 3 недели назад
3
Koroleva Ego
Зарегистрирован 1 месяц назад
4
Star Lenon
Зарегистрирован 1 месяц назад
5
Данил Жевнеров
Зарегистрирован 2 месяца назад
Хотите что-то узнать? Задавайте Ваш вопрос на нашем сайте
ru.kzen.dev
ID
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией