段错误原因
包含但不仅限于以下内容
-
非法内存访问:这是最常见的段错误原因之一。它包括:
* 解引用空指针:当代码试图访问一个空指针所指向的内存时,会导致段错误。
* 数组越界访问:当代码试图访问数组的超出边界范围的元素时,会导致段错误。
* 试图写入只读内存:当代码试图对只读内存进行写操作时,会导致段错误。 -
栈溢出:当递归调用层数过多或者函数调用链太深时,会导致栈溢出,也会引发段错误。
-
使用释放的内存:当代码试图使用已被释放的内存时,会导致段错误。
-
内存对齐错误:某些硬件平台对内存访问有要求,如果不满足对齐限制,会导致段错误。
-
其他原因:还有其他一些少见的原因,比如在多线程环境下,未正确同步对共享资源的访问可能导致段错误。
解决方法
gdb调试
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a = 5;
int *p = &a;
cout << "a=" << a << ",&a=" << &a << endl;
cout << "p=" << p << ",*p=" << *p << endl;
p = 0;
cout << "*p=" << *p << endl;
return 0;
}
这是源代码(只是举个例子),我们编译运行一下
这个时候我们只知道出错了,但是错在哪我们不知道,除非我们一行代码一行找,在代码很多的时候这个方式很明显不好用,那么这个时候就用gdb调试。
修改这个值,可能无法修改,那么切到root用户去改
再次运行就会出现吐核了
并且多了一个core文件,这个时候就用到gdb调试了
精准定位到了13行,这样问题就找到了,之后其他的gdb调试方法就自行使用吧