Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >段错误?打的就是段错误!!

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

作者头像
看、未来
发布于 2020-08-26 03:20:50
发布于 2020-08-26 03:20:50
3.8K00
代码可运行
举报
运行总次数:0
代码可运行

呵,段错误?自从我看了这篇文章,我还会怕你个小小段错误? 请打开你的Linux终端,跟紧咯,准备发车!!嘟嘟嘟哒~~

①一段有段错误的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>

void errfunc()
{
	int *p = NULL;
    *p = 1;
}

int main()
{
    errfunc();
    return 0;
}

这段代码拿去运行,肯定段错误。

②跟我一起 -> 直达病灶

系统会在程序崩溃的那一刹那将整个内核的信息记录在一个文件里边。如果你是第一次,那么ls是查不到的。

这样:使用命令 ulimit -a 打开ulimit这个文件。会看到如下:

发现这个文件大小缺省为0,文件根本就装不进去,那么就需要我们手动将这个文件的大小改大一点:ulimit -c 10240,当然,可以设置别的大小,看你心情。

然后再运行一次段错误的文件,然后去ls,就会发现一个core.xxxx的文件,这里提醒一下,最好先ls,看看系统下有没有已存在的core文件,省的到时候不知道是哪个。

接下来有一步可走可不走的:可以使用命令 file core.4377(我测试的号码是这个) ,将core.4377这个文件的具体信息给显示出来,命令最后会显示这个core文件是通过哪个文件产生的。

最后一步:gdb调试。这个执行文件叫dcw,是我的。gdb dcw core.4377,就会看到如下:

在最后,它会告诉你,在那个函数、那个地址出了问题。有些比较高级的gdb甚至会告诉你是哪一行!!可惜我的gdb就不说。。。

哈哈,开个玩笑。 注意:调段错误,编译的时候一定要加入-g选项,要不然在最后显示错误的时候只会显示错的地址,而不会显示错误的具体信息

最后退出gdb调试:q,回车

③看我对症下药

段错误的原因无非是内存越界,据不完全统计,主要有以下这些情况:

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无法进行移除操作,此时再进行读写操作肯定是段错误的。

加油啦,一定是可以实现的啦!!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/05/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel实战技巧80: 添加可视化的指示标志
视觉效果比枯燥的数字更有表现力。我们常常将数据图表化,我们也可以对图表中的一些细节可视化以作为补充。本文将展示如何在解释文本中添加可视化的指示标志,使读者在看文字之前对其表达的含义有一个大致的了解。
fanjy
2020/06/03
9320
Excel公式技巧97:多条件查找
有时候,我们需要根据多个条件在数据表中查找值,此时,就需要使用一些公式技巧了。本文的示例使用INDEX函数/MATCH函数组合的数组公式来实现多条件查找。
fanjy
2021/07/12
1.8K0
Excel公式技巧97:多条件查找
关于单元格区域,99%的用户都不知道的事儿
在Excel中使用单元格区域是最基础的操作,似乎一切都自然而然,不需要教,例如,选择一些单元格,开始单元格和结束单元格之间会有一个:(冒号)符号,也许可以加入几个$(美元符号)来固定单元格引用的位置。
fanjy
2023/08/30
2520
关于单元格区域,99%的用户都不知道的事儿
问与答99:如何根据组合条件求和?
Q:如下图1所示的数据排列,每组数据都由“月份、分类、字母、数值”组成,但是月份在单独的行,其他的数据分布在各行中且存在重复。
fanjy
2021/03/12
2.8K0
问与答97:如何实现实现条件求和与查找?
Q:如下图1所示,在工作表列A、列B和列C中存放着一些统计数据,即每天整点时的数据,现在要求出每天所对应数据的平均值并输入到列F中,同时要获取每天12时的数据并输入到列G中。如何使用公式解决?
fanjy
2021/03/12
1.2K0
问与答88: 如何获取成绩排在最后5名的学生姓名?
Q:我有一个学生成绩表,如何使用公式获取成绩排在最后5名的学生姓名,如下图1所示。
fanjy
2020/10/09
2.1K0
问与答88: 如何获取成绩排在最后5名的学生姓名?
使用VBA实现数字雨效果
在Excel中,借助于Excel公式、条件格式和一点点VBA代码,也能实现高科技题材电影中的数字雨效果。如下图1所示。
fanjy
2022/11/16
1.4K0
使用VBA实现数字雨效果
单元格里的进度条
选择单元格区域C4:V4。单击功能区“开始”选项卡“样式”组中的“条件格式——新建规则”,在“新建格式规则”对话框中,选择规则类型为“使用公式确定要设置格式的单元格”,在“为符合此公式的值设置格式”中输入公式:
fanjy
2024/04/12
1870
单元格里的进度条
[视频号]不用编程也能动态显示/隐藏提示
有时候,我们想在工作表中放置一些操作提示,在用户需要时显示,不需要时可以隐藏,但又不想使用VBA,那该怎么办呢?
fanjy
2021/10/15
3.4K0
[视频号]不用编程也能动态显示/隐藏提示
Excel实战技巧96:高亮显示内容为同年同月的单元格
Excel的条件格式是一项很强大很实用的功能,能够实现很多需要VBA编码才能实现的效果。本文是条件格式的一个应用示例。
fanjy
2020/12/18
2.2K0
Excel实战技巧96:高亮显示内容为同年同月的单元格
Excel实战技巧94: 显示过期事项、即将到期事项提醒
我们可以在工作表中安排计划,并让通过特殊显示来提醒已经过期的事项和即将到期的事项,以便让我们更好地安排工作。
fanjy
2020/12/08
6.7K0
Excel实战技巧94: 显示过期事项、即将到期事项提醒
Excel公式技巧36: 标识重复值
一组数据中往往会出现重复值,有时,我们想要标识出这些重复值,让人一眼就看出这些值来。我们使用了COUNTIF函数来实现,如下图1所示。
fanjy
2020/06/11
9870
Excel实战技巧101:使用条件格式确保输入正确的日期
前言:本文学习整理自chandoo.org,这是一个非常好的Excel学习网站,我在上面学到了很多Excel知识和技巧。
fanjy
2021/03/25
2.8K0
问与答126:如何高亮显示指定日期?
Q:在列A中是一系列日期,我如何操作,使得含有当天日期的单元格显示为红色,距离当天10天内的日期单元格显示为黄色?
fanjy
2021/06/01
2.1K0
问与答126:如何高亮显示指定日期?
Excel实战技巧88:使用条件格式标识数据
如下图1所示,在列E中有一组数据,现在要在列A中标识出在列E中的数据,在列B中标识出不在列E中的数据。
fanjy
2020/09/18
1.3K0
Excel实战技巧88:使用条件格式标识数据
精通Excel数组公式006:连接数组运算
连接运算符是:&,可以将两个或多个项目连接成一个项目,这些项目可以是数字、文本(使用引号括起来)、公式结果,等等。
fanjy
2020/07/07
1.7K0
问与答82: 如何动态更新价格?
Q:在如下图1所示,在列E中添加新的价格增长值后,列B中的价格会自动更新,如何用公式实现?
fanjy
2020/04/24
8340
问与答81: 如何求一组数据中满足多个条件的最大值?
Q:在工作表中有一些数据,如下图1所示,我想要获取“参数3”等于“A”、”参数4“等于”C1“对应的”参数5”中的最大值,能够使用公式解决吗?
fanjy
2020/04/20
4K0
使用Python Xlsxwriter创建Excel电子表格(第4部分:条件格式)
>>>使用PythonXlsxwriter创建Excel电子表格(第2部分:公式,链接与命名区域)
fanjy
2021/12/06
4.6K0
使用Python Xlsxwriter创建Excel电子表格(第4部分:条件格式)
使用复选框控制条件格式
我们可以使用条件格式来实现。选择A2:C20,单击功能区“开始”选项卡“样式”组中的“条件格式——新建规则”。在“新建格式规则”对话框中,选择“使用公式确定要设置格式的单元格”,在“为符合此公式的值设置格式”中输入:
fanjy
2022/03/09
2.3K0
使用复选框控制条件格式
推荐阅读
相关推荐
Excel实战技巧80: 添加可视化的指示标志
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验