为什么 Linux/UNIX 系统会出现段错误?
根据维基百科:
当程序试图访问不允许访问的内存位置,或试图以不允许的方式访问内存位置(例如,试图写入只读位置,或覆盖操作系统的一部分)时,就会发生段错误。
通常设置信号 #11 (SIGSEGV),该信号在头文件 signal.h 中定义。程序在收到 SIGSEGV 时默认的操作是异常终止。此操作将结束进程,但可能会生成核心文件(也称为核心转储)以帮助调试,或执行其他与平台相关的操作。核心转储是计算机程序在特定时间(通常是程序异常终止时)的工作内存的记录状态。
下列情况下也可能出现分段错误:
a) 有缺陷的程序/命令,只能通过打补丁来修复。
b) 当您在 C 编程中尝试访问超出数组末尾的数组时,也会出现这种情况。
c) 在 chrooted jail 中,当关键共享库、配置文件或 /dev/ 条目丢失时,可能会发生这种情况。
d) 有时硬件、内存或驱动程序故障也会产生问题。
e) 为所有计算机设备维持建议的环境(过热也会产生此问题)。
调试分段错误建议
要调试此类错误,请尝试以下一种或所有技术:
- 使用 gdb 来追踪问题的确切来源。
- 确保安装并配置正确的硬件。
- 始终应用所有补丁并使用更新的系统。
- 确保所有依赖项均安装在 jail 内。
- 为 Apache 等支持的服务启用核心转储。
- 使用strace,它是一个有用的诊断、指导和调试工具。
- 通过 Google 查找是否有解决问题的方法。
- 修复 C 程序中的逻辑错误,例如指针、空指针、数组等。
- 使用 gdb 分析系统生成的核心转储文件
进一步阅读:
- 阅读维基百科中有关分段错误的内容。
- 编译内核时发出信号11。
- 示例调试会话:分段错误示例
- 为什么这不起作用!?如何查找和修复Linux应用程序中的故障。
- 手册页 gdb、核心、信号
请在下面的评论中添加您的建议和调试技巧。