Как вы говорите, вы можете перебросить его, так что вы можете перебросить его внутри другого блока try/catch
с более конкретными предложениями, чтобы извлечь исключение (и еще один ...
, если вы также хотите). Вы даже можете сделать это внутри другой функции, чтобы централизовать обработку исключений.
Изменить: Я неправильно понял важность gdb
в вашем вопросе, но вы можете применить идею, которую я описал. Создайте функцию, которая повторно генерирует исключение, в котором вы можете установить точку останова:
void
helper()
{
try {
throw;
} catch (int i) {
// anything that won't get optimized away
volatile int j = i; // breakpoint here
}
}
Тогда в gdb
просто сделайте call helper()
. Я только что проверил это, чтобы убедиться, что это сработало.
Дальнейшее редактирование: если вы в буквальном смысле имеете в виду , я запускаю программу под gdb прямо сейчас и вы не выходите из gdb
, пока не убедитесь, что не можете получить исключение, тогда пришло время взглянуть на eh_throw.cc
и друзей в gcc
источнике. __cxa_rethrow
начинается с:
__cxa_eh_globals *globals = __cxa_get_globals ();
__cxa_exception *header = globals->caughtExceptions;
Вам придется изучить все эти структуры, чтобы выяснить, что скрыто внутри.