Linux开发中常见段错误问题原因分析

常见段错误 在Linux内存管理中,Linux结合了CPU架构采用了分段机制; 分段就是将内存分成大小不同的段空间,将进程之间和进程内部不同数据段之间隔离起来; 当程序内存的数据的访问超出了系统所给这个程序数据段的范围,系统就会给进程发送一个信号SIGSEGV,程序将终止退出。 所以,可以说段错误都是对内存操作错误引起的。 这里列举了常见的段错误: 1.访问不存在的内存、访问未知的受保护的内存; 阅读详情

1 使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因。

 

2 内存读/写越界。包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等。

 

3 对于C++对象,应该通过相应类的接口来去内存进行操作,禁止通过其返回的指针对内存进行写操作,典型的如string类的c_str()接口,如果你强制往其返回的指针进行写操作肯定会段错误的,因为其返回的地址是只读的。

 

4 函数不要返回其中局部对象的引用或地址,当函数返回时,函数栈弹出,局部对象的地址将失效,改写或读这些地址都会造成未知的后果。

 

5 避免在栈中定义过大的数组,否则可能导致进程的栈空间不足,此时也会出现段错误,同样的,在创建进程/线程时如果不知道此线程/进程最大需要多少栈空间时最好不要在代码中指定栈大小,应该使用系统默认的,这样问题比较好查,ulimit一下即可知道。这类问题也是为什么我的程序在其他平台跑得好好的,为什么一移植到这个平台就段错误了。

 

6 操作系统的相关限制,如:进程可以分配的最大内存,进程可以打开的最大文件描述符个数等,在Linux下这些需要通过ulimit、setrlimit、sysctl等来解除相关的限制,这类段错误问题在系统移植中也经常发现,以前我们移植Linux的程序到VxWorks下时经常遇到(VxWorks要改内核配置来解决)。

 

7 多线程的程序,涉及到多个线程同时操作一块内存时必须进行互斥,否则内存中的内容将不可预料。

 

8 在多线程环境下使用非线程安全的函数调用,例如 strerror 函数等。

 

9 在有信号的环境中,使用不可重入函数调用,而这些函数内部会读或写某片内存区,当信号中断时,内存写操作将被打断,而下次进入时将无法避免地出错。

 

10 跨进程传递某个地址,传递的都是经过映射的虚拟地址,对另外一个进程是不通用的。

 

11 某些有特殊要求的系统调用,例如epool_wait,正常情况下使用close关闭一个套接字后,epool会不再返回这个socket上的事件,但是如果你使用dup或dup2操作,将导致epool无法进行移除操作,此时再进行读写操作肯定是段错误的。

【Linux】学会 core dump 事后调试 快速定位段错误 环境: centos 6.5 core dump是什么其实就是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。最常见的就是段错误,然后程序直接挂掉。当程序出现段错误时,不要一脸蒙蔽,有一种简单而有效的方式快速定位错误。常见 core dump 错误总结自前辈的经验:一、无效指针 对空指针进行了操作 对未初始化的指针进行了操作 使用一个已经 阅读详情

相关推荐

考虑风和浪的影响的旋筒帆船航线优化方法研究

针对旋筒帆船进行航线优化的实现方法,包括升阻力系数的数值模拟、升阻力系数的多元非线性回归建模、旋筒帆船6DOF摇荡运动建模分析以及考虑风、浪影响的旋筒帆船的航线优化研究。

m0_63225885的博客 1163

linux大名鼎鼎的段错误解决之道(1)

132f50和132fe7很接近,很大可能是这个函数出现,而且又是读地址非法,这个函数有可能会出错这个问题,__strncmp_sse42这个函数是被strncmp调用的,看到这个函数基本上可以确定应该是这个函数惹得祸。首先遇到这个问题,不要怀疑是系统原因,一定要仔细分析自已的代码,对于有内存或指针操作的函数,一定要仔细检查,一般来说都是以上原因,几乎没有意外了。查看系统日志, 如果程序真的崩溃了,会在系统中留下痕迹,,这个值在有些错误时是错误的,下面会讲一下,第三个值为堆栈指针。

海纳百川,有容乃大。 1935

Uds诊断自动化(CANoe.diva应用)

(7)其他配置选择可以保持默认(一般情况下,DTC以及31服务、下载服务需要另外测试)。(1)打开CANoe.Diva软件,并新建Diva工程。(2)设置工程名和保存位置;在"Specification file"(3)测试案例打开后的界面如下,可以对要进行测试的案例进行勾选,(可查看下角的进度条)后;(3)等待DIva工程的生成;(4)接下来是修改Diva工程选项,如下图点击。,如用例间的时间间隔、复位等待时间等。,即可打开导入的测试工程。,即可生成测试用例。(1)在CANoe中。

LIUJIAAAAA的博客 3444

Linux 套接字编程中的 5 个隐患

M. Tim Jones , 资深软件工程师, Emulex2005 年 10 月 08 日在 4.2 BSD UNIX® 操作系统中首次引入,Sockets API 现在是任何操作系统的标准特性。事实上,很难找到一种不支持 Sockets API 的现代语言。该 API 相当简单,但新的开发人员仍然会遇到一些常见的隐患。本文识别那些隐患并向您显示如何避开它们。隐患 1.忽略返回状态第一个缺陷很明

baggio785的专栏 1963

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

RH850从0搭建Autosar开发环境【3X】- Davinci Configurator之Port模块配置详解(MCAL配置)

weixin_42412049的博客 2278

java技术专家【面试】Java程序员英语面试整个流程

java技术专家【面试】Java程序员英语面试整个流程

大壮 755

strcpy问题

The strcpy() function copies string s2 to s1, including  the      terminating  null character, stopping after the null charac-      ter has been copied. The strncpy() function copies exactly n

lotus302的专栏 605

OpenTK简介

OpenTK 因其强大的功能、跨平台特性和灵活性,适用于多种需要图形和计算能力的应用场景,为开发者提供了丰富的可能性和创作空间。

仰望星空的博客 1980

模拟linux内核异常,解决gem5/M5 模拟器“kernel too old”错误

编译安装了gem5 ARM架构的模拟器,运行使用arm-linux-gcc-4.4.3交叉编译链编译的文件时,出现了如下错误:%--------------------------------------------------------------------------------------------------------------------%**** REAL SIMULATIO...

weixin_42106357的博客 917

XDMA Scatter-Gather(SG)模式

XDMA Scatter-Gather(SG)模式 是 Xilinx FPGA 中用于高效处理 ​非连续内存数据 的 DMA 传输机制,通过 ​描述符链表(Descriptor List)​ 管理多块分散数据,显著减少 CPU 开销并提升吞吐量。

浩瀚之水的专栏 2142

scratch经典游戏主题源码分享,包含了20多款经典游戏

经典游戏案例:1、360度角度射击游戏 2、捕鱼达人 3、超级马里奥 4、超级玛丽 5、吃豆人相关 6、穿着喷气背包的海龟 7、大鱼吃小鱼 8、俄罗斯方块 9、飞机大战 10、愤怒的小鸟 11、黄金矿工 12、节奏大师 13、连连看 14、迷宫游戏 15、跑酷游戏 16、扫雷 17、水果忍者 18、坦克大战 19、推箱子 20、消除泡泡 21、保卫萝卜 22、植物大战僵尸

IT_Scratch的博客 1万+

linux系统库函数之strcpy、strncpy

91 #ifndef __HAVE_ARCH_STRCPY 92 /** 93 * strcpy - Copy a %NUL terminated string 94 * @dest: Where to copy the string to 95 * @src: Where to copy the string from 96 */ 97 #undef strcp...

weixin_30599769的博客 454

2024 全国大学生新质生产力大赛 B:金融违规交易的大数据分析 问题四思路代码

问题四:请分析附件中所有的指标数据,选取合适的指标,建立“金融违规 洗钱交易的预测模型”,并选取合适的训练集和测试集,计算预测模型的准确率。 为了提前识别并预测金融违规洗钱的交易事件,请基于你们团队数据分析的结果, 分别给公安部门和银行机构提出你们的建议。

YOLO 376

linux 内核编程 常见错误,Linux开发中常见段错误问题原因分析

51Testing软件测试网 D4LJ_y}1、使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因。51Testing软件测试网C%ZAw4S51Testing软件测试网.H(~9S8SN1p2、内存读/写越界。包括数组访问越界,或在使用一些写内存的函数时,长度...

weixin_39869733的博客 367

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

段错误?打的就是段错误!!

文章目录①一段有段错误的代码②跟我一起 -> 直达病灶③看我对症下药 呵,段错误?自从我看了这篇文章,我还会怕你个小小段错误? 请打开你的Linux终端,跟紧咯,准备发车!!嘟嘟嘟哒~~ ①一段有段错误的代码 #include<stdio.h> void errfunc() { int *p = NULL; *p = 1; } int main() { errfunc(); return 0; } 这段代码拿去运行,肯定段错误。 ②跟我一起 -> 直.

看,未来的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[Linux] 什么是 段错误(吐核)?

吐核:突出了一个“核心转储文件”(core dump文件)也是使用gdb调试器最常用到的场景 查看核心转储文件 ll -a查看全部文件 +默认隐藏文件 其实操作系统有限制,默认不允许随意吐核,影响机器性能 ulimit -a查看与程序相关的属性 core file size就是刚才吐核的核心转储文件,为0表示不允许吐核, 更改一下文件大小为无限制ulimit -c unlimited 再执行./h...

giturtle's blog 6万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux 段错误详解

By Falcon ofTinyLab.org 2015/05/12 目录 1背景 2什么是段错误 3段错误日志分析 3.1例子 3.2段错误信息 3.3段错误分析 4常见段错误举例 4.1scanf 参数:把 &i 写为 i 4.2sprintf/printf 参数:%d/%c 写成 %s 4.3数组访问越界 4.4写只读内存 4.5

feixiaku的专栏 4216

【Linux】段错误(核心已转储)(core dumped)问题的分析方法

【Linux】段错误(核心已转储)(core dumped)问题的分析方法

努力才是唯一的入场券。 1万+

段错误原因分析和查找

段错误原因分析和查找 2014-07-10 15:02 7561人阅读 评论(0) 收藏 举报  分类: linux开发(111)  linux命令(21)  目录(?)[+] http://www.cnblogs.com/panfeng412/archive/2011/11/06/2237857.html 最近在Li

jfkidear的专栏 1600

linux开发常见段错误问题原因

1、使用非法的内存地址(指针),包括使用未经初始化及已经释放的指针、不存在的地址、受系统保护的地址,只读的地址等,这一类也是最常见和最好解决的段错误问题,使用GDB print一下即可知道原因。   2、内存读/写越界。包括数组访问越界,或在使用一些写内存的函数时,长度指定不正确或者这些函数本身不能指定长度,典型的函数有strcpy(strncpy),sprintf(snprint)等等。

willianlong的专栏 588
上一篇: GDB调试的一些很有用经验
下一篇: Linux启动过程详解
大副
博客等级 码龄19年 35粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值