在C++catch(..)块中是否可以访问抛出的异常

Can a thrown exception be accessed in a C++ catch(...) block

本文关键字:访问 异常 是否 C++catch      更新时间:2023-10-16

我将GDB附加到当前位于catch(...)块内的进程。

是否有已知的技术可以访问抛出的异常

有问题的程序是一个gcc/x86-64二进制程序,但我也对其他版本感到好奇。

正如您所说,您可以重新抛出它,这样您就可以将它重新抛出到另一个具有更具体子句的try/catch块中以提取异常(如果您愿意,还可以再抛出另一个...)。您甚至可以在另一个函数中执行此操作,以便集中处理异常。

编辑:我在你的问题中误解了gdb的重要性,但你可以应用我描述的想法。制作一个函数来重新抛出您可以在中设置断点的异常:

void
helper()
{
    try {
        throw;
    } catch (int i) {
        // anything that won't get optimized away
        volatile int j = i;  // breakpoint here
    }
}

然后在gdb中只执行call helper()。我只是测试了一下以确保它有效。

进一步编辑:如果你的意思是我现在正在gdb下运行一个程序,并且在确定无法获得异常之前,你不会退出gdb,那么是时候查看eh_throw.ccgcc源中的朋友了。__cxa_rethrow以:开头

  __cxa_eh_globals *globals = __cxa_get_globals ();
  __cxa_exception *header = globals->caughtExceptions;

你必须检查所有这些结构,找出里面埋着什么。

我还没有测试过这一点,但异常(或者至少是指向它的指针)可能应该在堆栈上靠近头部的某个地方。我想确切的位置和格式取决于实现,但您应该能够将堆栈的这个区域中的不同地址强制转换为您的异常类型(或者至少转换为std::exception),并查看是否获得了有意义的结果。