Можно ли получить доступ к выброшенному исключению в блоке catch (...) C ++ - PullRequest
2 голосов
/ 12 января 2012

У меня есть GDB, присоединенный к процессу, который в данный момент находится внутри блока catch(...).

Есть ли известный метод для доступа к этому выброшенному исключению?

рассматриваемая программа представляет собой двоичный файл gcc / x86-64, но мне также любопытно узнать о других сборках.

Ответы [ 2 ]

5 голосов
/ 12 января 2012

Как вы говорите, вы можете перебросить его, так что вы можете перебросить его внутри другого блока 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;

Вам придется изучить все эти структуры, чтобы выяснить, что скрыто внутри.

1 голос
/ 12 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...