Ви можете спробувати скористатися "точкою лову" ( catch throw
), щоб зупинити відладчик у точці, де генерується виняток.
Наступний уривок із посібника gdb описує особливість точки вибору.
5.1.3 Встановлення точок лову
Ви можете використовувати точки точок, щоб зупинити відладчик для певних видів програмних подій, таких як винятки C ++ або завантаження спільної бібліотеки. Використовуйте команду catch для встановлення точки лову.
виловлювальний захід
Зупиніться, коли відбудеться подія . подією може бути будь-яка з наступних:
подія tcatch
Встановіть точку лову, яку ввімкнено лише для однієї зупинки. Точка лову автоматично видаляється після першого впіймання події.
Використовуйте info break
команду для переліку поточних точок лову.
Наразі в GDB є обмеження щодо обробки винятків C ++ (викидання та вилов):
Якщо ви викликаєте функцію інтерактивно, 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, ви можете зупинити свою програму, коли буде піднято певний виняток. Ви можете використовувати кілька умовних точок зупинки, щоб зупинити свою програму, коли порушено будь-який з ряду винятків.
handle SIGUSR1 pass noprint nostop