在 gcc/linux 中运行 C++ 函数?

问题描述

在 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...