Linux C中段错误常见解决办法

1.如果没有生成core文件,可以查询系统log

  通过命令 sudo cat /var/log/messages |grep segfault 或者sudo dmesg|grep segfault  来查询段错误的具体信息。

这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number. 在上面的信息中,error number是4 ,下面详细介绍一下error number的信息。

error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.。
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界 
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界 
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址 。

2.Linux 下打开core文件,定位segfault

Linux下有核心转储文件即core文件,会把程序崩溃是的现场保存起来供gdb来调试。

如果终端没有开启核心存储文件功能,可以通过ulimit -c unlimited 进行打开,在打开之前,可以调用ulimit -c 查看当前的大小,如果是0,表示不生成core文件。unlimited 的含义是不论生成的core文件有多大,我都让系统生成core 文件。

在开启自动存储核心文件后,可以运行该核心了;一般core文件会生成在你的可执行文件所在的目录,可以进行修改,方法是 修改 /proc/sys/kernel/core_pattern

这个文件不支持vi的方式修改,可以使用echo;如echo “/corefile/core-%p-%e-%t” > /proc/sys/kernel/core_pattern

这个语句的含义是将core文件生成在 /corefile/这个目录下,生成的文件名的格式是:“core”-“pid”-可执行程序名-段错误时间

%p ---------段错误进程的PID %e-----------发生段错误的可执行文件名%t------- 发生段错误的时间

生成core文件,进行调试的方法为:

gdb -c core test

3.产生分段错误的原因

1.访问了不存在的内存地址;

2.访问系统保护的内存地址;

3.访问只读的内存地址;

4.栈溢出;

4.注意事项

1、出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因。

2、在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL。

3、在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等。

4、在访问变量时,注意变量所占地址空间是否已经被程序释放掉。

5、在处理变量时,注意变量的格式控制是否合理等。

参考文献:

[1].https://wenku.baidu.com/view/1e82c07fa26925c52cc5bf3a.html

[2].https://blog.csdn.net/yuzeze/article/details/53144072

[3].https://blog.csdn.net/guaiguaihenguai/article/details/78701008

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux段错误(Segmentation Fault)是指程序在访问内存时,访问了未被授权的内存区域,导致操作系统主动终止该程序的执行。 要解决段错误问题,首先需要了解其产生的原因。常见的引起段错误的原因包括: 1. 使用了空指针或野指针:程序试图访问一个未内存或已释放的内存地址。 2. 数组越界访问:程序试图访问超出数组范围的元素。 3. 栈溢出:函数调用嵌套过深,导致栈空间不够。 4. 动态内存管理问题:未正确释放已配的内存。 要解决段错误问题,可以采取以下方法: 1. 使用调试工具:使用gdb等调试工具可以帮助定位段错误的位置。通过在出错的地方设置断点并观察调用栈,可以定位到错误发生的原因和具体位置。 2. 编译选项:在编译时加入`-g`选项可以生成调试信息,有助于追踪错误。同时,使用`-Wall -Wextra`等选项开启更多的警告信息,可提前发现潜在的问题。 3. 检查内存访问:仔细检查代码,确保没有使用空指针或野指针,并避免数组越界访问。 4. 增加日志输出:在关键部增加打印日志的语句,可以帮助定位错误发生的具体位置。 5. 使用灾难恢复代码:合理处理可能发生错误的情况,避免程序因为一处错误而崩溃。 6. 使用内存检测工具:例如Valgrind等工具可以帮助检测内存管理问题,发现未释放的内存或其他潜在问题。 总之,解决段错误需要通过调试、代码审查和合理的错误处理机制来逐步排查和解决问题,确保程序的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值