异常处理程序

scd*_*dmb 10 c++ exception-handling g++

有这个代码:

char text[] = "zim";
int x = 777;
Run Code Online (Sandbox Code Playgroud)

如果我查看放置x和文本的堆栈,那么输出是:

09 03 00 00 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)

哪里:

  • 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){
}
Run Code Online (Sandbox Code Playgroud)

堆:

09 03 00 00 **97 85 04 08** 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)

现在textx之间放置了新的4字节值.如果我添加另一个捕获,那么会有类似的东西:

09 03 00 00 **97 85 04 08** **xx xx xx xx** 7a 69 6d 00
Run Code Online (Sandbox Code Playgroud)

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

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

MSa*_*ers 5

AFAICT,这是一个指向"展开桌子"的指针.根据Itanium ABI实现建议,进程"[使用]展开表,[找到]如何处理在该PC上发生的异常的信息,特别是获取该地址范围的个性例程的地址. "

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