Запуск функции на C++ в gcc/linux?

Есть ли способ в gcc/linux вызвать определяемую пользователем функцию сразу после выполнения любого оператора throw C++, но до того, как стек будет раскручен до улова? (Я хочу захватить трассировку стека.)

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

2 ответа

Если вы используете libstdc++, вы можете переопределить __cxa_throw().

Например:

      #include <cstring>

void __cxa_throw(void *, void *, void (*)(void *)) {
    std::puts("bad luck");
}

int main() {
    throw 13;
}

на месте метания можно сделать так:

      try { throw 13; }
catch (...) { print_stack_trace(); rethrow;}

Конечно, если вы хотите, чтобы это было везде , то вам понадобится автоматическое редактирование, чтобы поместить это туда (или такой макрос): непроверенный код

      #define THROW(x) do { \
                   try {throw(x);} \
                   catch(...) { print_stack_trace(); rethrow;} \
                 } while(false)

или еще проще:

      #define THROW(x) do { \
                   print_stack_trace(); \
                   throw(x); \
                 } while(false)
Другие вопросы по тегам