在C++catch(..)块中是否可以访问抛出的异常
Can a thrown exception be accessed in a C++ catch(...) block
我将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.cc
和gcc
源中的朋友了。__cxa_rethrow
以:开头
__cxa_eh_globals *globals = __cxa_get_globals ();
__cxa_exception *header = globals->caughtExceptions;
你必须检查所有这些结构,找出里面埋着什么。
我还没有测试过这一点,但异常(或者至少是指向它的指针)可能应该在堆栈上靠近头部的某个地方。我想确切的位置和格式取决于实现,但您应该能够将堆栈的这个区域中的不同地址强制转换为您的异常类型(或者至少转换为std::exception),并查看是否获得了有意义的结果。
相关文章:
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 从二进制文件中读取元素时引发异常(引发异常:读取访问冲突. _Pnext 0xB414D4)
- 引发异常:读取访问冲突.**此**0x40错误
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 当我尝试访问结构类型时,我收到 std::bad_variant_access 异常
- 抛出的 Visual Studio 异常:写入访问冲突。q_deck->p_deck 0x110112。C 语言
- Visual Studio图形调试器引发读取访问冲突异常
- C++中的内存分配(引发异常:读取访问冲突)
- 为什么访问模板化变体作为返回值抛出异常
- 存在内存访问异常,但我不确定我的代码中出了什么问题
- 函数引发写入访问异常
- 使用XMVector时的内存访问异常
- 根据CIN类型插入空隙*?始终获取unsigned_char的访问异常
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- log4cxx访问异常,使用<<运算符和宏