分段错误和堆栈溢出有什么区别?

问题描述:

例如,当我们调用say,递归函数时,连续的调用被存储在堆栈中。但是,如果它无限地发生错误,则会出现“分段错误”(如GCC上所示)。分段错误和堆栈溢出有什么区别?

它不应该是'堆栈溢出'?这两者之间的基本区别是什么?

顺便说一句,一个解释将比*链接更有用(通过了,但没有回答具体的查询)。

+4

溢出的东西是关于编程问题,故障的东西是关于服务器。 oO – 2010-04-21 18:13:53

+2

@Pavel:SIGSEGV与服务器有什么关系?虽然服务器应用程序可能会导致分段错误,但这与服务器管理以及与编程有关的所有事情无关。 – 2010-04-21 18:17:10

+5

@George:http://serverfault.com/和whoosh。 – kennytm 2010-04-21 18:20:21

堆栈溢出是导致分段错误的原因。


至少在x86和ARM,“堆栈”是一块内存用于放置局部变量和返回的函数调用地址保留。当堆栈耗尽时,保留区外的内存将被访问。但是该应用程序并未向内核请求此内存,因此会生成SegFault以进行内存保护。

调用堆栈正在溢出,但溢出的结果是最终调用相关的值被推入内存中,而不是堆栈的一部分,然后 - SIGSEGV

现代处理器使用内存管理器来保护进程彼此。 x86内存管理器有许多遗留功能,其中之一是分割。分割是为了防止程序以某种方式操纵内存。例如,一个段可能被标记为只读,并且代码将被放在那里,而另一个段被读取/写入,这就是数据所在的位置。

在堆栈溢出期间,会耗尽分配给其中一个段的所有空间,然后程序开始写入内存管理器不允许的段,然后出现段错误。

+1

非常确定Unix早就使用过这个术语,因为它在x86附近的任何地方...... – SamB 2013-12-01 06:12:19

+2

@SamB我不明白答案的其他地方。 “x86内存管理器有许多遗留功能,其中之一就是细分”!=“x86发明了细分”。 – JBentley 2014-01-25 15:22:54

+2

x86使用的分段(段寄存器)与操作系统执行的地址空间的“分段”完全不同。分段错误与段寄存器无关。另外,虽然长期以来x86是x86的一部分,但对于现代操作系统中的x86如何工作,段寄存器仍然非常重要。 – SoapBox 2014-01-25 15:41:32

堆栈溢出可以显示为显式堆栈溢出异常(取决于编译器和体系结构),也可以显示为分段错误,即无效的内存访问。最终,堆栈溢出是堆栈空间用尽的结果,堆栈空间不足的一个可能结果是读取或写入您不应访问的内存。因此,在许多体系结构中,堆栈溢出的结果是内存访问错误。