SIGSEGV 是一种类型的信号,表示计算机程序发生了段错误。段错误通常是由于程序访问了不属于它的内存空间,
导致系统触发了保护机制而发送信号。这通常是由于程序中存在 bug,或者是由于系统内存分配出现问题所致。解决
SIGSEGV 错误通常需要调试程序并修复 bug,或者重新配置系统内存以解决内存分配问题。
1 问题背景
写好Android C++代码,运行起来崩溃,日志如下:
11-25 15:07:25.546 24467 24527 E glesdemo: ReadMissingBones, m_BoneInfoMap address 0x7e70ed0f88, size 52
11-25 15:07:25.554 24467 24527 E glesdemo: GetBoneIDMap, m_BoneInfoMap size 0
11-25 15:07:25.654 24718 24718 I
Segmentation fault (SIGSEGV)是一种常见的错误,它表示程序试图访问无效的内存地址。这通常是由以下几个原因引起的:
1. 野指针:当程序试图访问已经释放或未初始化的指针时,就会发生Segmentation fault。这通常是由于程序中存在野指针或者指针未正确初始化导致的。
2. 数组越界:当程序试图访问数组中超出其边界的元素时,就会发生Segmentation fault。这可能是由于循环索引错误、数组下标错误或者指针算术错误引起的。
3. 栈溢出:当程序的递归深度过大或者函数调用层次过多时,栈可能会溢出,导致Segmentation fault。
4. 内存访问冲突:当多个线程同时访问同一块内存时,可能会发生内存访问冲突,导致Segmentation fault。
解决Segmentation fault的方法包括:
1. 检查指针:确保指针已经正确初始化,并且在使用之前没有被释放。
2. 检查数组边界:确保在访问数组元素时,不会超出数组的边界。
3. 检查递归深度和函数调用层次:确保递归深度和函数调用层次不会过大,避免栈溢出。
4. 使用同步机制:在多线程程序中,使用适当的同步机制来避免内存访问冲突。
下面是一个示例代码,演示了Segmentation fault的原因和解决方法:
#include <stdio.h>
int main() {
int *ptr = NULL;
*ptr = 10; // 野指针,会导致Segmentation fault
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) { // 数组越界,会导致Segmentation fault
printf("%d\n", arr[i]);
return 0;