在Linux系统中,什么是段错误?

38

在Linux中:

什么是分段错误?我知道它会使程序崩溃,但这是否涉及到内存泄漏问题,还是完全无关的问题?此外,如何处理这些错误?通常是计算机设置的问题还是应用程序本身的问题?

同时,在其他操作系统中是否也会发生这种情况?


4
什么是“段错误”? - harto
1
在Windows上,“分段错误”被称为“访问冲突”。它们是同一件事,只是名称不同。 - Dean Harding
在Mac OS上,有时会出现总线错误 -_-。 - Borealid
1
可能是什么是段错误?的重复问题。 - Shaishav Jogani
2个回答

31

分段错误是指当程序试图访问未被操作系统分配的内存,或者试图访问不允许访问的内存时所出现的错误。

"分段"是指你电脑上每个进程都有自己独立的虚拟地址空间的概念。因此,当进程A读取内存位置0x877时,它读取的信息位于与进程B读取其自己的0x877时不同的物理RAM位置上。

所有现代操作系统都支持并使用分段技术,因此都可以产生分段错误。

要解决分段错误,需要修复导致错误的代码。这通常表明编程存在问题,特别是边界条件错误、指针操纵不正确或对共享库作出无效假设等。有时,像任何问题一样,分段错误可能是由于故障硬件引起的,但通常情况下不是这样。


3
段错误与虚拟地址空间无关。 - porges
1
正如我所解释的那样,“分段”错误的名称来自于不同的虚拟地址空间。在应用程序使用未经转换的物理地址的领域中,上下文切换将是极其昂贵的。这些概念是密不可分的。 - Borealid
1
我相信Porges指的是当你尝试写入只读内存时,也会发生分段错误,这实际上与虚拟内存无关。 - Dean Harding
是的,正确的,当通过mprotect()或直接由操作系统保护的内存进行访问时,会出现段错误等等。我的第一行解释了什么是段错误。接下来的几行尝试解释为什么和如何发生。也许我应该少说一些。 - Borealid
我并不是说你完全错了,只是这个概念并不依赖于那个 :) 也许我应该写一个更长的句子… - porges

6

'segfault'是指程序访问受保护或无效的内存,通常是由于不良的内存管理或有缺陷的指针操作引起。

操作系统检测到无效的内存访问并崩溃应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接