问题描述
在 gcc/linux 中有什么方法可以在任何 C++ throw 语句执行后立即调用用户定义的函数,但在堆栈展开到 catch 之前? (我想捕获堆栈跟踪。)
(在 gdb 中,我可以写 catch throw
。无论如何要以编程方式在缺少编译器扩展的情况下做到这一点?)
解决方法
如果您使用的是 libstdc++
,则可以覆盖 __cxa_throw()
。
例如:
#include <cstring>
void __cxa_throw(void *,void *,void (*)(void *)) {
std::puts("bad luck");
}
int main() {
throw 13;
}
,
在您的投掷场地,您可以这样做:
Error: read ECONNRESET
当然,如果你想要无处不在,那么你需要一些自动编辑将它放在那里(或像这样的宏):未经测试的代码>
try { throw 13; }
catch (...) { print_stack_trace(); rethrow;}
甚至更简单:
#define THROW(x) do { \
try {throw(x);} \
catch(...) { print_stack_trace(); rethrow;} \
} while(false)