Запуск функции на 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)