linux出现segment fault怎么解决?

简单来说,Linux中的段错误意味着程序破坏了内存。
其实很简单。
要么数组超出范围。
比如我们去年做的项目,有一个孩子使用了动态数组,忘记扩容了,直接访问了3 000级内存。
或者它是一个空指针引用。
上次我们更改代码时,我们忘记检查 malloc 返回值,这导致了崩溃。

我们先来说说最重要的事情。
9 0% 的分段错误是由内存越界引起的。
用技术术语来说,我们所说的是雪崩效应。
事实上,前面的一个小延迟会影响其余部分,例如函数处理超时。
还有一点是,内存泄漏虽然不会直接导致段错误,但它会让系统的可用内存越来越少,最终导致无法分配内存的崩溃。
很多人不注意这一点。

我一开始以为是编码错误导致的段错误,后来发现是错误的。
有些是硬件问题,例如内存模块接触不良。
等等,还有别的事。
内核更新后,某些内存操作出现问题。
要看dmesg中是否有相关日志。

建议首先检查核心转储文件。
如果没有生成,就在GDB中调试即可。
不要害怕麻烦。
老实说,这很令人困惑,但在找到根本原因后,我意识到值得尝试可以节省大量时间的静态分析工具。

linux下,gcc提示“段错误 (核心已转储)”,ubuntu刚上手不大会用,谁说一下是啥问题

是的,数组越界了。
就像您的手机内存不足一样,该程序正在访问错误的内存。

非法访问内核内存。
您的手机似乎没有足够的权限来查看系统文件。

堆栈溢出? Linux 上的默认堆栈是 8 M。
当我打开一个巨大的数组时,堆栈不够用。

这称为段错误,这意味着已超出内存边界。
gdtr寄存器记录内存限制,类似于手机内存管理。

越界访问、CPU保护、分段错误!就像你的手机坏了,你找不到你的文件一样,编程中指针的使用也不正确。

linux段错误

说白了,在Linux中编写一个使用socket的服务器分为三个步骤:监听、接收、回复。
但实际操作中也存在一些潜在的陷阱。

我们先来说说最重要的事情。
Accept 是一个阻塞函数。
去年,我们几乎在运行该项目时遇到了麻烦,但后来我们意识到必须添加超时。
另外需要注意的是sin_addr.s_addr既是0又是一个通配符地址。
去年,一位同事写道,这是一个固定 IP,但它只接受来自他自己的 LAN 的连接。
还有另一个重要的细节。
例如,在写入接收字符时需要加上EOF,否则会像按Ctrl+Z时一样突然断开。
说实话,这很令人困惑。

一开始以为随便加while(1 )就可以了,后来发现并发高的时候直接烧CPU了。
等等,还有别的事。
如果您使用 htonl 和 htons 来混合字节顺序,例如sin_port直接写入8 8 8 8 ,那么在h3-endian机器上将不会收到连接。

应打印有关错误代码的具体信息。
例如,当接受失败时,请考虑错误是什么。
不要只是写下并接受失败!并运行。
很多人不注意这一点。
您应该尝试添加 strerror (errno)。