Segmentation fault (core dumped) -llinux系统内存错误报错信息

目录

  • 1 问题原因
    • (1)内存访问越界
    • (2)多线程程序使用了线程不安全的函数。
    • (3)多线程读写的数据未加锁保护。
    • (5)堆栈溢出。
  • 2 使用GDB查看core文件
  • 3 使用GDB调试程序

返回目录

1 问题原因

Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。

更为详细的原因:

返回目录

(1)内存访问越界

a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

返回目录

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

返回目录

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

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

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

返回目录

(5)堆栈溢出。

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

返回目录

2 使用GDB查看core文件

默认编译出来的程序在出现Segmentation fault 时并没有生成core崩溃文件,可以在gcc/g++编译时增加-g选项。

如果仍然没有生成core文件,则可能是因为系统设置了core文件大小为0,可以通过:ulimit -a 查询得知。

执行 ulimit -c unlimited 命令后可以使core文件大小不受限制。此时再次运行程序应该就能在同级目录看到core.XXX文件了

使用 gdb ./a.out core.XXX 可以查看出错所在行信息,这样就进入了 gdb core 调试模式。

追踪产生segmenttation fault的位置及代码函数调用情况:

gdb>bt

这样,一般就可以看到出错的代码是哪一句了,还可以打印出相应变量的数值,进行进一步分析。

返回目录

3 使用GDB调试程序

如上述流程不能解决问题,下面可使用gdb单步调试程序。重新编译程序,编译命令中加入-g。如:

gcc -lm -O3 -g file.c -o file
之后使用gdb命令

gdb file
开始调试。

输入start使程序运行到main中第一行运行代码。next或者n为执行下一行程序,until xx执行到xx行,print或p可输出变量值,b xx用于在xx行设置断点,run或r用于执行程序至下一断点,d xx删除xx行断点。

我们可以先run一遍程序,这时它会提示出错行信息。然后until到出错行前5行,交替执行next和print,输出与出错行变量相关变量或指针的值。最终定位出错的根本操作在哪一行。修改之即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256912.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 抽屉布局

目前部分APP使用一种类似抽屉式的布局,像QQ那种,感觉很炫,自己也一直想做一个像那样的布局,(ps网上很多这样的例子,我下面做的就是参考网上的改变的) 废话不就不说了,直接上代码 1、…

学习笔记(35):Python网络编程并发编程-协程(yield,greenlet,gevent模块)

立即学习:https://edu.csdn.net/course/play/24458/296457?utm_sourceblogtoedu 协程(yield,greenlet,gevent) 1.协程:在单线程中通过不断地在多个任务之间进行切换执行,来达到并发的效果的线程,可以提高效率 2.yiel…

双目标定算法

坐标系基础知识: > 1.1. 从像素坐标系(u,v) 到 世界坐标系(Xw,Yw,Yw) 这里直接拿上篇博文的结果,中间省去了其它坐标系直接的关系,直接给出,如下所示: 公式如下: > 1.2. 符号规定( Notation ) 为了…

Spring bean三种创建方式

spring共提供了三种实例化bean的方式:构造器实例化(全类名,反射)、工厂方法(静态工厂实例化 动态工厂实例化)和FactoryBean ,下面一一详解: 1、构造器实例化 City.java 1 package com.proc.bean;2 3 publ…

Excel使用控件创建动态地图图表

[本文软件Excel 2010] 效果图: 首先我们看一下数据源 数据源中第二列是对应图形的名称。首先创建图形,我们可能在网络中找到各个地图的矢量图形。不过不是每个地图图形都适合我们,或许企业划分非按照行政区划分。因此可以尝试自己绘制&#x…

Windows 10 常用的快捷键及常用指令

系统快捷键 快捷键功能说明备注CtrlShiftEsc打开任务管理器macbook: fnshiftF11普通键盘: PrintScreen截屏幕图macbook: fnshiftoptionF11普通键盘: altPrintScreen截取当前窗口图片macbook: WinfnEsc普通键盘: WinPause/Break打开系统属性WinctrlD新建虚拟桌面Windows 10Winct…

学习笔记(35续):Python网络编程并发编程-基于gevent及线程池实现的并发套接字通讯

1.基于线程池实现并发套接字通讯:因为套接字涉及地是I/O密集模型,因此使用多线程会有高效率 服务器 #基于线程池完成并发的套接字通讯 from socket import * from threading import Thread from concurrent.futures import ThreadPoolExecutordef commun…

使用Configuration Manager部署及管理软件更新(2)

承接上一篇文章:http://ericxuting.blog.51cto.com/8995534/1543835 一、 确定软件更新符合性 1. 打开Configuration Manager管理控制台,点击软件库,展开软件更新,点击所有软件更新 2. 点击主页中的运行摘要,等待对话框…

NULL、nil、Nil、NSNull的区别

标志值含义NULL(void *)0C指针的字面零值nil(id)0Objecve-C对象的字面零值Nil(Class)0Objecve-C类的字面零值NSNull[NSNull null]用来表示零值的单独的对象转载于:https://www.cnblogs.com/wlsxmhz/p/56250…

Fiddler 域名过滤

原来一直没意识到Fiddler过滤,导致每次抓包都要自己判断、搜索好多东西,真是呵呵! 过滤设置很简单,看懂一张图就解决问题了。 箭头 那两处设置下,圆圈处保存再进行抓包即可 转载于:https://www.cnblogs.com/eejron/p/4…

windows中VS卸载opencv配置,重新安装其他版本

1、找到工程的属性管理器,电机Debug64和Release64下面的 包含目录和库目录,删掉其原由配置的oepncv路径; 找到链接器中的附加依赖项,删掉原有的配置;

学习笔记(36):Python网络编程并发编程-IO模型介绍

立即学习:https://edu.csdn.net/course/play/24458/296460?utm_sourceblogtoedu I/O模型介绍:I/O模型表示处于等待状态的模型,如套接字通讯的accept和recv函数一样 1.同步I/O 2.异步I/O 3.阻塞I/O 4.非阻塞I/O

AD9 如何画4层pcb板

新建的PCB文件默认的是2层板,教你怎么设置4层甚至更多层板。在工具栏点击Design-->Layer Stack Manager.进入之后显示的是两层板,添加为4层板,一般是先点top layer, 再点Add Layer,再点Add Layer,这样就成了4层板。见下图。 有…

gulp 流处理

包含的内容: 穿插流流合并流队列流筛选1. 穿插流// passthrough stream 把流传递给其他的// usegulp.src(glob,{passthrough:true})// function 进行流的合并处理,避免多余配置以及冗余代码 2. 合并流// 使用merge2// install yarn add merge2 or …

windows上使用cmake 编译yaml-cpp源码,生成yam-cpp.lib

1、打开cmake-gui 2、添加CmakeList 3、建立build 4、进入工程中生成debug和release版本的lib

BZOJ 3039: 玉蟾宫( 悬线法 )

最大子矩阵...悬线法..时间复杂度O(nm)悬线法就是记录一个H向上延伸的最大长度(悬线), L, R向左向右延伸的最大长度, 然后通过递推来得到. ------------------------------------------------------------------#include<bits/stdc.h>using namespace std;#define ok(c) …

学习笔记(37):Python实战编程-yield实现生成器

立即学习:https://edu.csdn.net/course/play/19711/255579?utm_sourceblogtoedu1.yield return generator yield是一个返回的是一个生成器对象&#xff0c;是通过next函数一次一次地进行函数地迭代来获取结果的&#xff0c;而return函数则是将结果返回后&#xff0c;不再与…

ie6、7 下input的边框问题 ?

input的border设置为none,ie8及以上border都兼容&#xff0c;ie6和7的border还继续存在&#xff0c;将border设为0时所有浏览器上都不存在了&#xff0c;但是border为0时还是会继续的渲染。 将input的border设为"0 none",ie7及以上都正常了&#xff0c;但是ie6上inpu…

Mocha BSM产品亮点——关联事件分析

业务需求与挑战企业经常会遇到下列场景&#xff1a;• 企业某应用&#xff0c;例如&#xff0c;WebSphere Portal Server&#xff0c;已经不可用&#xff0c;是由于应用自身已不可用&#xff1f;还是应用所连接的数据库出了问题&#xff1f;还是应用的LDAP服务不可用&#xff1…

轻量级文本编辑器,Notepad最佳替代品:Notepad++

目录 正文之前1. 目的2. 原帖3. 为何推荐Notepad3.1. Notepad的一些基本特点3.2. notepad&#xff0c;notepad2&#xff0c;notepad&#xff0c;ultraEdit比较4. 使用Notepad前要了解的知识4.1. Notepad的名称和缩写4.2. Notepad修改设置后&#xff0c;立即生效4.3. Notepad的版…