Segmentation fault (core dumped)

在linux下变成有时会出现这样的情况,编译时没有error,但是执行时会出现Segmentation fault (core dumped)

core dumped就是核心转储,进程异常终止,进程用户空间的数据就会被写到磁盘。但是linux下一般不会产生core文件

需要用到gdb调试工具:

1、首先使用ulimit -a查看你的core file size是否为0.如果不是的话就请跳到步骤3, 如果是的话,请接着看下面的步骤。

2、然后使用ulimit -c 1024命令修改core file size。这里我们暂且把修改为1024吧。

      不放心的话可以再使用ulimit -a查看core file size

3、下面再次运行程序让其错误信息存储于core file并使用ll查看core file信息以便于使用gdb。

4、接下来我们使用gdb调试工具查看错误原因,使用命令gdb core-file core定位error(关于这一句命令,先使用ll命令查看是因为要知道你的core file名称才好使用gdb调试)。可以看到我的c++代码error应该是Program terminated with signal SIGSEGV, Segmentation fault.


可能原因

1.内存访问越界

 a) 由于使用错误的下标,导致数组访问越界

 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符

 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2 多线程程序使用了线程不安全的函数。

3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump

4 非法指针

a) 使用空指针

b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型 的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它 时就很容易因为bus error而core dump.

5 堆栈溢出.不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

出现了Segmentation fault,基本上的原因是,非法的内存访问。
例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,所以要检查申请空间时间偶成功。。。
还有那个问题在调试时会有这样的信息:Program terminated with signal SIGSEGV, Segmentation fault.
对于SIGSEGV这个信号,经常会和SIGBUS信号出现在一块,SIGBUS与SIGSEGV信号的一般区别如下:

1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。
通常是未对齐的数据访问所致。
2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。

通常导致段错误的几个直接原因:

1、解除引用一个包含非法值的指针。

2、解除引用一个空指针(常常由于从系统程序中返回空指针,并未经检查就使用)。

3、在未得到正确的权限时进行访问。

4、用完了堆栈或堆空间(虚拟内存虽然巨大,但绝非无限)。

 

 

重点参考:

https://blog.csdn.net/dzhongjie/article/details/80280192

https://blog.csdn.net/weiyuefei/article/details/79383608

你可能感兴趣的:(视觉,激光SLAM)