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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Linux】段错误(核心已转储)(core dumped)问题的分析方法
在Linux系统中,程序运行时可能会遇到段错误(Segmentation Fault),这是一种常见的运行时错误,通常由于程序试图访问其内存空间中未分配(或不允许)的部分时发生。
程序员洲洲
2024/06/14
4.5K0
【Linux】段错误(核心已转储)(core dumped)问题的分析方法
SoC出现段错误,如何快速定位到故障函数?
定位SoC中段错误的核心思路是“确定范围 -> 提取信息 -> 复现问题 -> 修复”:
不脱发的程序猿
2025/01/07
970
SoC出现段错误,如何快速定位到故障函数?
GDB调试core文件样例(如何定位Segment fault)
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)
阳光岛主
2019/02/19
4.6K0
GDB 调试工具使用方法详解
finish:运行程序,知道当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
知忆
2021/06/23
1.6K0
如何优雅的调试段错误
摘要:当程序运行出现段错误时,目标文件没有调试符号,也没配置产生 core dump,如何定位到出错的文件和函数,并尽可能提供更详细的一些信息,如参数,代码等。 第一板斧 准备一段测试代码 018.c #include <stdio.h> int main(int argc, char *argv[]) {    FILE *fp = NULL;    fprintf(fp, "%s\n", "hello");    fclose(fp);    return 0; } 编译运行 $ gcc 0
F-Stack
2020/05/18
4.7K0
C语言段错误调试神器(core dump)
core dump 可以理解为当程序崩溃时,自动将内存信息保存到文件中。这里的 core 就是 memory,dump 就是将内存数据保存到磁盘的过程。
混说Linux
2022/11/18
2.2K0
C语言段错误调试神器(core dump)
Segmentation Fault (Core Dumped):段错误的完美解决方法
大家好,我是默语,擅长全栈开发、运维和人工智能技术。在这篇博客中,我们将详细探讨Segmentation Fault (Core Dumped)这一常见的错误。这种错误在开发过程中经常会遇到,尤其是在使用C/C++等低级语言时。我们将讨论其成因、常见场景以及解决方案,确保你能够有效应对这一问题并提高代码的健壮性。🔍
默 语
2024/11/22
2K0
Linux下使用gdb调试core文件
当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件。core文件是程序运行状态的内存映象。使用gdb调试core文件,可以帮助我们快速定位程序出现段错误的位置。当然,可执行程序编译时应加上-g编译选项,生成调试信息。
恋喵大鲤鱼
2018/08/03
41.9K0
Linux下使用gdb调试core文件
memset栈空间出现段错误
代码编译运行环境:Ubuntu 64bits+g++(-g -m64),-g表示生成调试版本,-m64表示生成64bits程序。
恋喵大鲤鱼
2018/08/03
3.5K0
memset栈空间出现段错误
深入浅出GDB调试器
GDB全称GNU symbolic debugger,它是诞生于GNU开源组织的(同时诞生的还有 GCC、Emacs 等)UNIX及UNIX-like下的调试工具,是Linux下最常用的程序调试器,GDB 支持调试多种编程语言编写的程序,包括C、C++、Go、Objective-C、OpenCL、Ada 等。但是在实际应用中,GDB 更常用来调试C和C++程序。虽然说在Linux系统下我们可以借助诸多集成开发工具来完成程序的编写和调试,但实际上,调试C/C++程序一定是直接或者间接使用GDB完成的。所以说GDB调试几乎可以说是Linux程序员必备的基本技能。本文将手把手教你使用GDB调试程序,并带你深入了解什么是GDB调试器。
mindtechnist
2024/08/08
4170
深入浅出GDB调试器
Segmentation fault (core dumped):段错误完美解决方法
“Segmentation fault (core dumped)” 是一个常见的程序崩溃错误,通常发生在 C 或 C++ 等低级语言编写的程序中。它意味着程序试图访问无效的内存地址,导致操作系统终止程序并生成核心转储文件。🎯 在这篇文章中,我将详细介绍如何排查和解决这个错误,适合任何开发者,尤其是编程小白。通过实用的技巧和代码示例,你将能有效地找到问题的根源并解决它。💡
默 语
2025/01/12
1.3K0
【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解
在案例中我使用c语言编写了一个简单的四层二叉树进行 GDB 调试练习。这个程序故意在后面引发了一个段错误,导致程序崩溃。文章将使用 GDB 来诊断这个问题。
SarPro
2024/04/23
1370
【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解
如何在Linux上获得错误段的核心转储
今天小编要跟大家分享的文章是关于Linux上错误段的核心转储问题。喜欢Linux操作系统,对Linux感兴趣的小伙伴快来看一看吧,希望通过本篇文章能够有所收获。
小小科
2020/05/20
4.1K0
GDB调试
约定:对gdb的命令,如果有缩写形式,会在第一次出现的时候小括号内给出缩写,比如运行命令写成run(r);本文中尖括号< >用来表达一类实体,比如<program>表示这个地方可以放置程序;中括号[]表示括号中的内容是可写可不写,比如[=<value>],表示“=<value>”可以有也可以没有(<value>本身又是一类实体);“|”表示或的关系。
玖柒的小窝
2021/12/14
2.2K0
GDB调试
【Linux】进程信号(中)
为什么除0就报错了呢? 当代码除0时,程序运行后就崩溃了,程序运行变为进程,进程运行代码时出现了非法代码,进程退出了
lovevivi
2023/10/16
2190
【Linux】进程信号(中)
掌握GDB调试工具,轻松排除bug
目前release的最新版本为8.0,GDB可以运行在Linux 和Windows 操作系统上。
嵌入式Linux内核
2023/06/28
8120
掌握GDB调试工具,轻松排除bug
调试coredump步骤(coredump原理)
  在上一篇文章中描述了如何使用Valgrind工具检查内存相关问题,包括内存泄露、空指针使用、野指针使用、重复释放等问题。对于大多数情况下,Valgrind的作用性体现更多在于“内存泄露”检查,因为空指针、野指针的访问,会引发程序段错误(segment fault )而终止,此时可以借助linux系统的coredump文件结合gdb工具可以快速定位到问题发生位置。此外,程序崩溃引发系统记录coredump文件的原因是众多的,野指针、空指针访问只是其中一种,如堆栈溢出、内存越界等等都会引起coredump,利用好coredump文件,可以帮助我们解决实际项目中的异常问题。
全栈程序员站长
2022/07/28
2.9K0
调试coredump步骤(coredump原理)
段错误等造成死机问题的分析
方法一:最简单办法,看打印,通过反复调试,看是哪条语句造成造成了死机。这种方法效率低,而且有时不准确,比如一个系统中有多个进程,但A进程跑的B断点是,出现段错误,系统发出11号信号,造成B,C等进程接到11号信号反初始化而推出。实际当中可能不一定是A进程原因,因为此时B,C等进程也在并发执行,甚至A,B,c 三个进程都在访问某一共享资源(如共享内存等)。
用户4148957
2022/06/14
1.2K0
GDB入门教程之如何使用GDB启动调试
写在前面:今天开始尝试写写除Vim外的其他内容,仍然是以技术为主,可能涉及的内容包括Linux、正则表达式、gdb、makefile等内容,不知道小伙伴们有没有兴趣看呢?不管如何,也算是我自己的知识沉淀吧~
我被狗咬了
2019/09/25
4.4K0
GDB入门教程之如何使用GDB启动调试
程序异常分析指南
在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core dumped)错误。而程序卡死一般来源于代码逻辑的缺陷,导致了死循环、死锁等问题。总的来看,常见的程序异常问题一般可以分为非法内存访问和资源访问冲突两大类。
Florian
2018/08/21
3.1K0
程序异常分析指南
相关推荐
【Linux】段错误(核心已转储)(core dumped)问题的分析方法
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文