异常处理程序

时间:2012-02-12 16:50:47

标签: 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

现在 text x 之间放置了新的4字节值。如果我添加另一个catch,那么会有类似的东西:

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

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

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

2 个答案:

答案 0 :(得分:5)

AFAICT,这是指向“展开桌”的指针。根据{{​​3}},进程“[使用]展开表,[找到]如何处理在该PC上发生的异常的信息,特别是获取该地址范围的个性例程的地址。 “

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

答案 1 :(得分:0)

毋庸置疑,这一切都取决于平台等等。

这可能是一个地址。它可能指向代码段(某个处理程序地址)或数据段(指向带有帧信息的构建时生成结构的指针),或者指向同一线程的堆栈(指向运行时生成的表的指针)框架信息)。 或者它也可能是垃圾,由于对齐要求而离开,EH可能会要求。

例如在Win32 / x86上没有这样的差距。对于使用异常处理的每个函数(具有try/catch__try/__except/__finally或具有d'tors的对象) - 编译器生成在堆栈上分配的EXCEPTION_RECORD结构(由函数prolog)码)。然后,每当函数内的某些内容发生变化时(对象被创建/销毁,try/catch块进入/退出) - 编译器会添加一条修改此结构的指令(更正确地 - 修改其扩展名)。但是没有更多的东西在堆栈上分配。