段错误(核心已转储)问题的分析方法

ORB SLAM3 ubuntu18.04 ROS 运行 段错误 (核心已转储) 踩坑及解决 ubuntu18.04 ROS 运行 ORB SLAM3 段错误 (核心已转储) 踩坑及解决 阅读详情

问题现象

今天在研究linux kernel中typedef的用法时,写了一个程序test_typedef.c,内容如下:

#include<stdio.h>

typedef int size;
typedef unsigned int word;
typedef char line[81];
typedef void (*printStr)(line text);
typedef printStr * pprintStr;
typedef char * pstr;

void printText(line text){
    printf("%s\n", text);
}

void * pppPrintText(line text){
    printf("%s\n", text);
}

pprintStr pprintText(){
    //return &printText;
    printStr temp = printText;
    return (printStr *)temp;
}
/*void (*pprintText)(line text){
    printf("%s\n", text);
}*/

void main(){
    size i=10;
    word w = 20;
    line text;
    printf("%d, %d, %d\n",i, w, sizeof(text)/sizeof(char));

    printStr printFun = printText;
    pprintStr pprintFun = pprintText();
    printFun("test typedef");
    //((printStr)pprintFun)("test pointer typedef");
    (*pprintFun)("test pointer typedef");

    char string[4] = "abc";
    pstr p1 = string;
    const char *p2 = string;
    p1++;
    p2++;
    printf("%s, %s\n", p1, p2);
}

加上37行的代码(*pprintFun)(“test pointer typedef”);后,通过gcc –o typedef test_typdef.c命令编译成typedef可执行文件后执行,出现段错误:

这里写图片描述

之前也遇见过“段错误(核心已转储)”(Segmentation fault(core dumped)),但是没有进行分析,今天借着这个机会学习一下这类问题的分析方法。

段错误的分析方法

段错误一般借助于可调试(使用-g选项进行编译)的原程序和核心转储后的core file来进行分析,如针对我写的程序,其步骤为:

  • gcc –g –o typedef test_typedef.c (生成可调试的可执行程序)
  • ./typedef (产生段错误,生成core file)
  • gdb –c core_file typdef (使用core file调试产生段错误的可执行程序)
  • 在gdb调试环境中执行bt或where命令定位到问题行

按如上步骤对typedef可执行程序的分析结果如下:

这里写图片描述

由上图可以看出,通过core file定位出来的问题代码行也是37行,说明分析结果的准确性。

core file的产生

core file文件是在程序异常退出时产生的,程序的异常退出往往是通过信号(signal)产生的,但并不是所有的信号都能够产生core file,在signal.h的头文件中定义了哪些signal可以产生core file,如下:

这里写图片描述
这里写图片描述

上图中所有default action为coredump的中断信号都可以产生core file。
除了中断信号必须能够产生coredump外,还必须进行如下设置:

  • ulimit –c unlimited (设置core file的大小,相当于使能core file的生成)
  • ulimit unlimited (设置file的大小)

其他问题

1. core file存放在哪个目录
存放core file一般存放在进程的当前工作目录,一般就是当初发出命令启动该进程时所在的目录。但如果是通过脚本启动,则脚本可能会修改当前目录,这时进程真正的当前目录就会与当初执行脚本所在目录不同。这时可以查看"/proc/pid/cwd"符号链接的目标来确定进程真正的当前目录地址。

2. core file的文件名
一般core file的文件名即为core,可能通过

echo "1" > /proc/sys/kernel/core_uses_pid

将core file的文件名改为core.pid

3. 如何修改core file的文件名格式和保存位置
/proc/sys/kernel /core_pattern可以控制core文件保存位置和文件名格式。可通过以下命令修改此文件:

echo  "/corefile/core-%e-%p-%t" >/proc/sys/kernel /core_pattern

可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused the coredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

4. 如果你当初是以用户A运行了某个程序,但在ps里看到的这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成core dump,需要将/proc/sys/fs/suid_dumpable 文件的内容改为1(一般默认是0)

参考技术文章

  1. http://www.cnblogs.com/yunlong3727/archive/2013/05/21/3090797.html
Linux 下运行 C++ 程序出现 “段错误(核心已转储)” Linux 下运行 C++ 程序出现 “段错误(核心已转储)”Linux下写C++程序出现“段错误(核心已转储)”的问题:段错误一般就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个... 阅读详情

相关推荐

【Linux】段错误(核心已转储)

刚做的新系统,1、内存还没用了 2.磁盘空间也肯没问题,刚做的,啥也没安装了。3.文件系统直接都好好的,就安装了软件,系统文件就能坏了?4.查看selinux,selinux也没问题 配置文件。5.那就是二进制文件损坏?查看slinux getenforce。直接查看 getenforce。命令的二进制文件可能损坏或不完整。安装完再添加用户就好了。

冰恋云的专栏 4090

【问题记录】Ubuntu 22.04 环境下,程序报:段错误(核心已转储)怎么使用 core 文件和GDB调试器 解决?

首先要确定核心转储文件的生成路径和大小限制。然后使用调试器(如 GDB)来分析核心转储文件和堆栈跟踪信息后,修复代码中导致“段错误”的原因。

weixin_43729127的博客 2万+

Verilog仿真必备:FSDB dump命令全解析与实战配置指南

本文深入解析了Verilog仿真中FSDB波形记录的核心命令与实战配置技巧。针对大规模SoC验证场景,详细介绍了如何通过$fsdbDumpvars、$fsdbDumpfile等命令实现信号精准捕获、文件体积控制和动态启停,并提供了智能化的分层dump策略,帮助工程师在保证调试信息完整性的同时,大幅提升验证效率并有效管理波形数据。

cnn8visionary的博客 348

Ubuntu20.04出现段错误核心已转储问题解决方案

ubuntu 20.04出现段错误核心已转储,使用GDB测试找不到core文件解决方案

weixin_52402390的博客 9万+

DMR对讲机的基本概念理解

刚刚入手DMR对讲机,尚未成功联通。国内互联网上能找到的资料很少,大多数也都是一些DMR协议介绍之类的玩意,对实际操作没有指导意义。以下全部是这几天在网上研究各种资料得出的个人思考,如有错误请斧正。 相比与模拟通讯系统,DMR将语音信号转换为包的形式进行收发。将DMR对比成TCP/IP系统会更容易理解。 一般DMR对讲机都支持模数双通,说明DMR应该使用了跟FM同样的无线AP组件,只在解码上有区别。对讲机先使用DMR进行数字解码,解码成功则说明是数字信号,不成功则使用模拟方式再次进行解码。可以对等理解为

1万+

Akamai-3.0补环境逆向-DHL快递查询

那么我们的请求过程就是:1.请求首页的html文件,通过re或xpath,提取到这个url,拼接官网地址,得到这个js文件的地址。返回的_abck为0,表示环境正确,请求搜索接口返回200,说明返回的_abck正确,如果过程错误或环境补的有问题会返回403或428这两个状态码。那么,就是这个包返回的,而且这个包需要请求两次,第一次get请求,返回的这个-1的cookie,第二次请求,带上一个sensor_data的参数,进行post请求,最终返回这个0的cookie,代表你过了akamai这个盾。

2302_76420666的博客 2857

运行可执行文件 提示:段错误 (核心已转储)

当你在运行程序时遇到段错误,你可以使用调试器(如GDB)来获取更多的信息,定位导致段错误的具体原因。然而,编译器无法在编译时完全检测出所有可能导致段错误的问题,因为一些错误只有在运行时才能被检测到。段错误通常是由于程序在访问无效的内存地址时触发的,这些无效的内存地址可能是由于上述列举的问题导致的。要解决段错误,你需要检查程序中可能导致错误的部分,特别是涉及指针操作和内存管理的地方。"段错误 (核心已转储)" 是一种常见的运行时错误,它通常表示程序访问了无效的内存地址。

xie3254417的博客 1万+

决策树简介/PPT

最近给我们组新生讲了决策树的相关知识,以下是所做的PPT,参考了网络资源。

垃圾就应该待在垃圾桶里的博客 3795

Linux:段错误(核心已转储) Segmentation fault (core dumped)(在Linux上如何得到一个段错误的核心转储)(笔记)(未完成,暂停)

在Linux上如何得到一个段错误的核心转储 文章目录什么是段错误?步骤1:运行 valgrind如何获得一个核心转储ulimit:设置核心转储的最大尺寸kernel.core_pattern:核心转储保存在哪里kernel.core_pattern 和 Ubuntu现在你有了核心转储,接下来干什么?(查看我的核心转储文件并把它拷贝到pc-linux下)从 gdb 中得到堆栈调用序列 什么是段错误? “ 段错误(segmentation fault)”是指你的程序尝试访问不允许访问的内存地址的情况。这可能是由

Dontla的博客 4万+

C# OpenCvSharp4实战:5分钟搞定工业视觉模板匹配(附完整代码)

本文为C#开发者提供了基于OpenCvSharp4的工业视觉模板匹配实战指南。通过详细的环境搭建、核心原理解析和完整代码示例,重点介绍了如何使用`matchTemplate`函数,特别是`CCoeffNormed`方法,快速实现高精度、抗光照变化的模板匹配,并分享了多目标匹配、图像预处理等工业级优化技巧。

weixin_29053067的博客 502

华为擎云W515 PGUV-WBY0安装银河麒麟V10全流程解析

本文详细解析了华为擎云W515 PGUV-WBY0安装银河麒麟V10系统的全流程,包括准备工作、镜像下载与校验、启动盘制作、BIOS设置、安装过程关键选择、系统初始化及常见问题排查。特别针对ARM架构设备提供了实用技巧,帮助用户顺利完成国产化系统的部署与优化。

weixin_28725949的博客 696

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

段错误(核心已转储)(core dumped)问题的分析方法1.段错误1.1段错误的含义1.2实际常见原因2.生成core文件2.1.使用命令 ulimit -a 查看core文件大小限制2.2使用 命令 ulimit -c 10240 (10240的位置可以是任意一个比较大的数字) 或者ulimit -c unlimited2.3 编译的时候一定要加入-g选项,要不然在最后显示错误的时候只会显示错的地址,而不会显示错误的具体信息2.4生成core的路径3.调试core 1.段错误 1.1段错误的含义

yuan 4万+

【PINN高级教程】 第1讲:函数空间与逼近理论

结论:在解决偏微分方程(PDE)时,解往往属于某个 Sobolev 空间 HsHs,其正则性受限于 PDE 的系数与边界条件;而 PINN 在训练过程中实际上是在逼近 Barron 空间中的函数。由于 Barron 空间允许高频信息的压缩,PINN 可以在参数规模较小的情况下捕捉到 PDE 解所需的细节,但其正则性保证仍然比 Sobolev 更弱。因此,在设计 PINN 时,需要通过正则化或网络结构(如残差连接、归一化层)来“逼近”Sobolev 正则性。

u012133341的博客 237

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

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

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

海康VisionMaster与西门子Smart 200进行S7通信

海康VisionMaster与西门子Smart 200进行S7通信

haier123888的博客 8177

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

段错误(核心已转储)问题的分析方法(未成功)

是否产生core dump ulimit -c 0 #unlimited太大,没有必要。 ulimit -c 10000 ulimit -c unlimited 用上面命令只会对当前的终端环境有效.如果想需要永久生效,修改文件 /etc/security/limits.conf文件,增加一行: # /etc/security/limits.conf # #Each line desc...

柳鲲鹏 5724

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

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

为什么会发生段错误(核心已转储)

引言 无论你是一个刚接触计算机的小白,还是一个久经沙场的大牛,相信你一定曾被段错误这个问题困扰过,这些问题有些是有低级的错误引发,当然也很好修改,通常动动手指头就OK了,但有些错误则是十分隐晦,通常难已发现。如果让我来说段错误 其实大多数时候出现它并不是坏事,相同情况如果不出现段错误,那才是坏事。 为什么会出现段错误 系统发送 SIGSEGV 信号给出现段错误的程序,信号本质上是一种软件形式的异常...

李兆龙的博客 3万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

linux系统“s段错误 (核心已转储)“错误解决的解决

s段错误 (核心已转储)错误解决 下载cuda时,下载地址 wget http://developer.download.nvidia.com/compute/cuda/10.2/Prod/local_installers/cuda_10.2.89_440.33.01_linux.run 时到99%报错 “剩余 2s s段错误 (核心已转储)” 使用ulimit -a命令查看内容如下: c...

seaflyren的博客 1万+

段错误 (核心已转储),core文件的常用处理。

最近在做一个摄像头的调试,总是出现“段错误 (核心已转储)”,记录一下对core 文件的常用处理,以及一些常用命令。 1)首先是运行程序遇到这样的错误段错误 (核心已转储) 2)打开产生core文件的指令 3)再次运行出现错误的程序 4)使用gdb指令运行core文件,排查错误 详细步骤如下: 1.运行我的程序出现一下错误 2.运行相关指令打开产生core文件的开关,并设置大小。 1)查看是否打开...

大白爱吃菠菜 7143

ubuntu段错误(核心已转储)

报错场景: Linux ubuntu-users 4.15.0-112-generic #113~16.04.1-Ubuntu ubuntu 16 问题描述: 在ubuntu :Linux ubuntu-users 4.15.0-112-generic #113~16.04.1-Ubuntu内核版本重启之后发现打开任何软件都会报:段错误(核心已转储)。 原因分析: core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件

qq_41072096的博客 1万+

Ubuntu16.04 段错误(核心已转储)的解决办法

由于软件需求我写了个测试软件,我定义两个u8 的buf为1280*720*8的大小,也差不多要接近于15M 的大小了,在语法没有错误的情况下直接报段错误(核心已转储)的错误。查找了相关的资料,在这里记录一下。 这里我们需要用到Linux下的一个指令: ulimit -a 电脑的信息如下: core file size (blocks, -c) 0 data seg s...

smile_5me的博客 2万+

Ubuntu 20.04 程序运行导致“段错误 (核心已转储)”的原因分析及解决方案 ubuntu

段错误是指程序试图访问未被允许的内存区域,或以不正确的方式访问内存时,操作系统为了保护内存的完整性而强制终止程序运行,并生成核心转储文件(core dump)。核心转储文件包含程序在崩溃时的内存映像,有助于调试和分析错误原因。

m0_73640344的博客 5837

段错误原因(核心已转储)

前几天写代码遇到的问题,之前在windows下的编译器可以找到报错,Linux这边编译过了,有个功能的问题,最后找到是我改变自定义协议之后,代码中的strtok_r少改一个对NULL继续分割。是 Linux/Unix 系统中程序运行时发生的严重错误,意味着你的程序试图访问它。这通常是由于程序中的引起的。

2302_80541912的博客 993

Ubuntu 20 core dumped(核心已转储)问题分析

core dumped

scjdas的博客 5466

段错误(核心已转储)的原因

一、什么是段错误? 一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。 二、段错误产生的原因 下面是一些典型的段错误的原因: 非关联化空指针——这是特殊情况由内存管理硬件 试图访问一个不存在的内存地址(...

小时候挺菜的博客 4万+
上一篇: Java 8新特性汇总
下一篇: Service xxx does not have a SELinux domain defined
不能止步
博客等级 码龄17年 2068粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值