c++ - 异常处理器

标签 c++ exception-handling g++

有这段代码:

char text[] = "zim";
int x = 777;

如果我查看 x 和文本所在的堆栈,输出为:

09 03 00 00 7a 69 6d 00

地点:

  • 09 03 00 00 = 0x309 = 777 <- int x = 777
  • 7a 69 6d 00 = char text[] = "zim"(ASCII 码)

现在有带有 try..catch 的代码:

char text[] = "zim";
try{
  int x = 777;
}
catch(int){
}

堆栈:

09 03 00 00 **97 85 04 08** 7a 69 6d 00

现在 textx 之间放置了新的 4 字节值。如果我再添加一个 catch,就会出现类似这样的内容:

09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00

等等。我认为这是与异常处理相关的一些值,它在堆栈展开期间用于在 try block 中抛出异常时找到合适的捕获。然而问题是,这个 4 字节的值到底是什么(可能是异常处理程序结构的某个地址或某个 ID)?

我在 32 位 Linux 机器上使用 g++ 4.6。

最佳答案

AFAICT,这是指向“展开表”的指针。根据 the Itanium ABI implementation suggestions ,进程“[使用] 展开表,[来] 查找有关如何处理该 PC 上发生的异常的信息,特别是获取该地址范围内的个性例程的地址。”

展开表背后的想法是很少使用堆栈展开所需的数据。因此,将指针放在堆栈上,并将剩余数据存储在另一个页面中会更有效。在最好的情况下,该页面可以保留在磁盘上,甚至不需要加载到 RAM 中。相比之下,C 风格的错误处理通常在 L1 缓存中结束,因为它都是内联的。

关于c++ - 异常处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9250609/

相关文章:

.net 异常池

c++ - 如何使用 gcc/g++ 11.1 导入模块

c++ - kd-tree 构建非常慢

c++ - 在多个线程中重写方法

java - 检测内存不足错误

c# - 无法将类型为 'System.Linq.Expressions.UnaryExpression' 的对象转换为类型 'System.Linq.Expressions.MemberExpression'

c++ - 将 ‘args’ 声明为引用数组错误

c++ - 尝试构建共享库 g++/mac 时 undefined symbol _main

c++ - 有没有办法在 C++ 中将方法存储在某种类型的 vector 中?

c++ - 强制非缓存 gethostbyname()