【问题标题】:Running function on C++ throw in gcc/linux?在 gcc/linux 中运行 C++ 上的函数?
【发布时间】:2021-04-22 05:42:06
【问题描述】:

在 gcc/linux 中是否有任何方法可以在任何 C++ throw 语句执行后立即调用用户定义的函数,但在堆栈展开到 catch 之前? (我想捕获一个堆栈跟踪。)

(在 gdb 中我可以写 catch throw。无论如何要以编程方式执行此操作而缺少编译器扩展?)

【问题讨论】:

标签: c++ linux gcc c++17 libstdc++


【解决方案1】:

如果您使用libstdc++,您可以覆盖__cxa_throw()

例如:

#include <cstring>

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

int main() {
    throw 13;
}

【讨论】:

  • @MarshallClow 好吧,当你在那里时,你可以做任何你想做的事,包括召唤合适的投掷者。
  • 如果是别人的程序,你可以使用LD_LIBRARY_PATH——我有一个例子here
  • 一个更好的例子here
  • @AaronD.Marasco 确实!感谢您提供这些链接。
  • 你会如何从 __cxa_throw 中调用“正确的投掷者”?正如马歇尔所说,一旦函数完成,我希望异常被抛出并正常捕获。
【解决方案2】:

在您的投掷地点,您可以这样做:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 2017-03-29
    相关资源
    最近更新 更多