什么是Segmentation fault(Core Dump)? + 我遇到的实例问题

C++段错误(Segmentation Fault)原理、排查与预防全指南 内存管理是编程中的核心概念,它决定了程序如何分配、使用和释放计算机的物理内存资源。其基本原理是操作系统为每个进程划分独立的虚拟地址空间,程序只能访问被授权的内存区域。在C/C++等系统级语言中,程序员拥有直接操作内存的能力,这带来了高性能,但也引入了内存访问违规的风险,如访问未分配、已释放或越界的内存区域。这种违规操作会触发操作系统的内存保护机制,导致程序被强制终止,并产生段错误(Segmentation Fault)。段错误是程序健壮性的重要威胁,尤其在开发高性能服务器、系统软件或嵌入式应用时,其排查与预 阅读详情



转:http://blog.chinaunix.net/space.php?uid=21830881&do=blog&cuid=2093542


什么是Core Dump?
Core的意思是内存, Dump的意思是扔出来, 堆出来.
开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.

如何使用core文件?
gdb -c core文件路径 [应用程序的路径]
进去后输入where回车, 就可以显示程序在哪一行down掉的, 在哪个函数中.

为什么没有core文件生成呢?
有时候程序down了, 但是core文件却没有生成. core文件的生成跟你当前系统的环境设置有关系, 可以用下面的语句设置一下, 然后再运行程序便成生成core文件.
ulimit -c unlimited
【没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。)
$ ulimit -c 1024 (转者注: 使用-c unlimited不限制core文件大小】

core文件生成的位置一般于运行程序的路径相同, 文件名一般为core.进程号

4. 用gdb查看core文件:
下面我们可以在发生运行时信号引起的错误时发生core dump了.
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件->行.

===========================================================================

造成程序core dump的原因很多,这里根据以往的经验总结一下:

1 内存访问越界

  a) 由于使用错误的下标,导致数组访问越界

  b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符

  c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

 

2 多线程程序使用了线程不安全的函数。

应该使用下面这些可重入的函数,尤其注意红色标示出来的函数,它们很容易被用错:

asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)

 

3 多线程读写的数据未加锁保护。

对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump

 

4 非法指针

  a) 使用空指针

  b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.

 

5 堆栈溢出

不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

============================================================================

我发生的问题(待解决中):

main.h:
typedef struct TS_PAT
{
   UINT8 table_id;
   UINT32 zero;
} TS_PAT;

main.c:
TS_PAT *PAT_DataTable;

void Load_PAT_table(FILE *stream){
       PAT_DataTable->table_id = 1;
}
上记代码,编译通过。


执行时:
Segmentation fault(core dumped)


用上记方法,最后的bt命令输入后:
#0   0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
76                           PAT_DataTable->table_id = 1;
(gdb) bt
#0   0x080486e7 in Load_PAT_table (stream=0x804c050) at main.c:76
#1   0x080487a5 in Parse_Adjust_PAT_table (stream=0x804c050) at main.c:137
#2   0x08049651 in main (argn=3, argc=0xbf96e284) at main.c:827

当注释掉”PAT_DataTable->table_id = 1;“的时候,没问题。
否则,在这行赋值语句执行时就down机。

原因:查明,,未对指针初始化(未分配起指向的内存空间)
http://topic.youkuaiyun.com/u/20091113/14/da645a0f-8c92-449d-b29d-f6c83561728c.html

core dump gdb调试 core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump) 在程序运行的过程中,有的时候我们会遇到Segment fault(段错误)这样的错误。这种看起来比较困难,因为没有任何的栈、trace信息输出。该种类型的... 阅读详情

相关推荐

linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

在Linux系统下,当程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息,编译时需要加上 -g -Wall)。我们使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。如何生成core文件和大小限制当系统程序运行产生而不是显示这说明,并没有产生code文件,我们需要执行以下命令来生成code文件,并限制文件大小。使用ulimit -c命令查看core文件的生成开关,如果结果为0,则表示关闭了此功能,不会生成core文件。

m0_73537205的博客 1万+

Segmentation fault (core dumped)错误常见原因总结

1 问题原因 Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。 更为详细的原因: (1)内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符 c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp

longteng_guo的博客 10万+

C++ 段错误 Segmentation fault 调试

core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern。:在编译程序时,使用合适的编译选项,如启用调试信息选项(例如-g),以便在出错时能够更好地定位错误的位置。

coco的专栏 1726

Segmentation fault (core dumped)

这个的报错

doodlesomething 4万+

linux重启出现Segmentation Fault(core dump)错误和libc.so.6文件误删解决

参考Segmentation Fault(core dump) 解决Centos下libc.so.6被破坏问题 覆盖已存在的软连接 3. 段错误信息的获取 程序发生段错误时,提示信息很少,下面有几种查看段错误的发生信息的途径。 3.1 dmesg dmesg可以在应用程序crash掉时,显示内核中保存的相关信息。如下所示,通过dmesg命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。以程序2.3为例: panfeng@ubuntu

qq_30905243的博客 3784

【C++】map的使用 报错:Segmentation fault (core dumped)

背景🎈🎈🎈:test为map,要删除test中key为“happy”的键值对。代码如下: std::map<string, uint32_t>::iterator it; for ( it= test.begin(); it!= test.end(); ++it) { if (strcmp(“happy”, (it->first).c_str()) == 0) { test.erase(it); } } 报错😱😱😱: Seg

静谧、淡雅 3000

php coredump文件路径,什么是Segmentation fault(Core Dump)? + 我遇到的实例问题

什么是Core Dump?Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.core dump又叫核心转储, 当程序运行过程中...

weixin_39805087的博客 471

ArcGIS供地图斑图形及属性入库操作(附练习数据)

已知数据: 供地图斑位置图。 供地图斑表格 成果要求:将供地图斑导入mdb数据库并将供地图斑表格的属性进行挂接。 接下来我们开始操作: 1、 打开arcmap,在目录内连接的文件夹内找到供地图斑位置图。图片 2、 将annotation和polygon添加到arcmap图片 3、 右击文件所在文件夹新建mdb数据库图片 4、 右击数据库新建要素数据集。(要素数据集非常重要,稍后所有操作都在数据集内进行)选择图斑投影方式及代号。图片 5、 右击要素数据集—导入(将图层内的数据导入数据库)图片 6、 数据导入.

qq_43173805的博客 8132

Segmentation fault(Core Dump)问题

最近做项目时,python调用c编译的动态链接库出现Segmentation fault(Core Dump)问题。 搜了下资料看,这个问题的原因是,空间段错误造成的。有如下几个可能的原因: 出现这种错误可能的原因(其实就是访问了内存中不应该访问的东西): 1、内存访问越界: (1)数组访问越界,因为下标出超出了范围。 (2) 搜索字符串的时候,通过字符串的结尾符号来判断结束,但是实际...

山中有石为玉 1万+

FastAPI + React:现代 Web 前后端分离开发的全栈实践指南

• 部署:CI/CD 双流水线,前端 push → GitHub Actions → Cloudflare Pages;• 后端:分层结构 routers → services → repositories → models,单测覆盖率 90 %。• 接口缓存:Redis + FastAPI Depends 实现接口级缓存,读 QPS 提升至 5 k。• 前端:BFF 由 React Query 代理,统一缓存、重试、分页。GET /items/{id} 详情。,前端同学无需等 Mock 即可联调。

未来已来,AI时代,学AI编程,做AI量化,就来大鹏AI教育。 1494

ESP32 CAM安装配置 第四部份:通过使用ESPHome的方式ESP32 Cam加到HomeAssistant

这些包括 aec_value, aec2, ae_level, agc_gain, gain_ctrl, bpc, wpc, raw_gma, lenc, hmirror, dcw, colorbar 等。这些参数的可能值和具体效果会根据你的摄像头硬件和 ESPHome 的版本有所不同。在 ESPHome 中配置 ESP32 Cam 时,每个参数的可能值取决于具体的功能和支持范围。值的范围是 0 到 63,其中 0 是最差质量,63 是最佳质量。horizontal: 水平校正的强度,通常是一个数字值。

weixin_42895252的博客 3364

Linux程序运行出现Segmentation fault (core dumped)的通用解决方法

之前v4l-test编译后运行时出现错误Segmentation fault (core dumped),段错误(核心已转储),因为代码不同,错误原因不一样,导致解决方法也不一样,所以找了许多都没有找到好的解决方法,最终在一篇博客发现这类问题的通用解决方法,博客地址如下: https://www.cnblogs.com/kuliuheng/p/11698378.html 1 问题原因 ...

qq_38892528的博客 7万+

数分实战(01):Global_Superstore数据集解析与商业洞察

本文以Global_Superstore零售数据集为例,手把手指导数据分析实战全流程。从数据清洗、探索性分析到深度商业洞察,详细解析了如何通过Python处理缺失值与异常值,进行销售利润分析、客户细分与地理分析,并探讨了折扣与利润的微妙关系。文章旨在帮助读者建立数据分析思维框架,从数据中挖掘可指导实际业务决策的核心洞察。

weixin_28487433的博客 342

GDB 调试 Segmentation fault (core dumped)

GDB 调试 Segmentation fault (core dumped)

程永强 906

Part03 数据结构

本文介绍了CSP-S初赛中常见的高级数据结构及其实现,包括: 线性结构:双端栈、双端队列、单调队列、优先队列和ST表,重点分析了它们的特点、时间复杂度及典型应用场景。 集合与森林:并查集(带路径压缩和按秩合并)和树的孩子兄弟表示法,展示了多叉树转化为二叉树存储的方法。 特殊树结构:包括二叉堆、树状数组、线段树和字典树,详细说明了它们的构建、查询和更新操作,特别强调了线段树的递归实现和字典树的前缀匹配特性。 每种数据结构都配有核心C++代码实现,涉及数组模拟、动态规划和树形结构等编程技巧,适合算法竞赛选手快速

weixin_43863957的博客 1180

SAPIEN ManiSkill3 入门教程(一)

请注意,table.set_pose(pose) 设置的是演员在世界帧中的坐标系姿势。移除的实体可以再次添加到场景中,但已在场景中的实体则不能再次添加。显示器可以是物理的(如显示器),也可以是虚拟的(如 VNC)。我们可以通过 get_pose()、get_linear_velocity() 和 get_angular_velocity()获取演员的运动量(姿势、线速度、角速度)。现在,让我们创建一个斜坡。例如,您可能需要一个简单的碰撞形状来进行快速模拟,但却需要一个复杂的视觉形状来进行逼真的渲染。

机器人控制与仿真应用 3074

Segmentation fault (core dumped)出错原因及位置分析

1. Segmentation fault (core dumped)原因 Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。 更为详细的原因: 1.内存访问越界 a) 由于使用错误的下标,导致数组访问越界 b) 搜索字符...

路漫漫其修远兮,吾将上下而求索。 5万+

倍福--TwinSAFE功能块的使用

在安全模块的程序设计中,输入变量取反,或者把PLC的变量连接到安全的功能块程序中, 操作流程 1.1. 功能块输出取反 例如修改IN,右击属性,然后可在Single-Channel选项中选择是NO还是NC的输入信号。 1.2. PLC标准变量作为安全程序的输入 1.2.1. 建立两个PLC变量 1.2.2. 安全程序区创建变量 1.2.3. 功能块变量链接 首先,PLC变量不能直接连到Estop功能块的输入变量中,否则会报错,但PLC可以连接到SafeAnd这些功能块,然后再转出来,如下所示

weixin_41883890的博客 5312

内存异常实例解析(core dump、segmentation fault)

释放栈上的指针 #include <iostream> using namespace std; int test(){ int a = 100; int *ptr = &a; free(ptr); } int main(){ test(); return 0; } 报错: invalid point...

夜风的博客 3500

太阳敏感器:卫星姿态控制的“指南针

在卫星姿态控制系统中,太阳敏感器(Sun Sensor) 是至关重要的光学姿态敏感器之一。它通过探测太阳光的方向,为卫星提供关键的姿态参考信息,确保卫星能够正确调整自身方位,维持稳定的对日定向,保障能源供应和任务执行。

ScilogyHunter的博客 1730

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Segmentation fault (core dumped)

在linux下变成有时会出现这样的情况,编译时没有error,但是执行时会出现Segmentation fault (core dumped) core dumped就是核心转储,进程异常终止,进程用户空间的数据就会被写到磁盘。但是linux下一般不会产生core文件 需要用到gdb调试工具: 1、首先使用ulimit -a查看你的core file size是否为0.如果不是的话就请跳到步...

try_again_later的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[linux仓库]调试Segmentation fault的利器:手把手教你开启和使用Core Dump[进程信号·叁]

本文介绍了Linux的coredump标志,解释了core和term信号的区别。核心转储(coredump)会在进程异常终止时生成core文件,记录进程上下文数据用于事后调试;而term信号则直接终止进程。通过ulimit命令可设置core文件大小限制,默认关闭以保护敏感信息。文章还探讨了信号处理机制,包括OS如何管理信号、进程何时处理信号以及信号存储位置等问题。最后通过代码示例演示了如何获取进程退出状态信息。

egoist2023的博客 1564

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于Segmentation fault (core dumped)几个简单问题

有的程序可以通过编译,但在运行时会出现Segment fault(段错误)。这通常都是指针错误引起的。但这不像编译错误一样会提示到文件一行,而是没有任何信息。一种办法是用gdb的step, 一步一步寻找。但要step一个上万行的代码让人难以想象。 我们还有更好的办法,这就是core file。 如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置: #设置c

yam_killer的专栏 6万+
上一篇: Linux下利用core来调试segmentation fault
下一篇: 学习计划201610
STN_LCD
博客等级 码龄15年 384粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值