coredump

linux原生

一、设置

$ cat /proc/sys/kernel/core_pattern

通过查看core_pattern文件,发现其确实指定了一个路径,于是我前往那个路径,发现竟然是脚本程序,后来查看说明文件,才知道core_pattern中如果首先指定了一个 ‘|’ 管道符,则会将生成的core文件传递给后面所跟的脚本去处理。

至此,也就确定了问题的原因,| 管道符后面的脚本将我们的core文件给吞了,解决方法自然就是去掉这个脚本,换成自己指定的目录,要保证存放Coredump的目录存在且进程对该目 录有写权限

若程序调用了seteuid()/setegid()改变 了进程的有效用户或组,则在默认情况下系统不会为这些进程生成Coredump。很多服务程序都会调用seteuid(),如MySQL,不论你用什么用 户运行mysqld_safe启动MySQL,mysqld进行的有效用户始终是msyql用户。如果你当初是以用户A运行了某个程序,但在ps里看到的 这个程序的用户却是B的话,那么这些进程就是调用了seteuid了。为了能够让这些进程生成core dump,需要将/proc/sys/fs

要设置足够大的Core文件大小限制 。程序崩溃时生成的Core文件大小即为程序运行时占用的内存大小。但程序崩溃时的行为不可按平常时的行为来估计,比如缓冲区溢出等错误可能导致堆栈被 破坏,因此经常会出现某个变量的值被修改成乱七八糟的,然后程序用这个大小去申请内存就可能导致程序比平常时多占用很多内存。因此无论程序正常运行时占用 的内存多么少,要保证生成Core文件还是将大小限制设为unlimited为好。

二、修改core位置

直接去修改core_pattern文件并没有成功,保存时会提示FSync错误,查阅资料得知,这个文件有特殊限制,只能通过命令:

sudo bash -c "echo 这里是写入内容 > /proc/sys/kernel/core_pattern "

我使用:

sudo bash -c "echo core > /proc/sys/kernel/core_pattern "

来进行写入,即指定程序所在目录为core文件生成目录,core文件名称为"core"。

可以通过修改kernel的参数来指定内核生成的coredump文件的文件名。常见设置如下:

方式一:

echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern


echo "|/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %h" > /proc/sys/kernel/core_pattern

 

方式二:

vim /etc/sysctl.conf

sysctl -p /etc/sysctl.conf

/data/coredump是你自己指定的存放coredump文件的路径,所有产生的coredump文件将会存放在这里,%e表示程序的文件名,%p表示进程的ID(当然还有一些其他的参数可以设置,例:%t显示创建的时间),但是前提要把目录/data/coredump创建好,不然无法生成文件

永久修改:使用sysctl -w name=value命令,/sbin/sysctl -w kernel.core_pattern=core-%p-%e

%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时间(由1970年1月1日计起的秒数)

%h - insert hostname where the coredump happened into filename 添加主机名

%e - insert coredumping executable name into filename 添加命令名(程序文件名)

三、修改core文件大小

linux系统默认生成core文件时空,可以用命令查看

ulimit -c
//详细信息
ulimit -a

如果结果是0,我们需要修改其大小

//当前有效的修改
ulimit -c [size]  //这里size一般修改为unlimited,或者是其他数字(kbytes):2048

如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此 core文件的时候,gdb会提示错误。

以上修改只对当前的shell有效,一旦关闭,则恢复原来的值

设置永久有效

打开 /etc/security/limits.conf文件

添加两行:

*     soft   core unlimited

*     hard  core unlimited

 

测试结果

不同设置情况下的core大小

 

Minicoredumper

编译安装

Git clone https://github.com/diamon/minicoredumper.git

安装autotools系列工具

要安装的工具有autoconf,automake,autopoint,libtool,gettext。

yum install -y autoconf

yum install -y automake

yum install -y libtool

yum install -y gettext

yum install -y autopoint 或者 yum install -y gettext-devel

若上述安装失败则使用以下安装方式为包管理工具(apt,yum)安装不了的情况下使用的。

下载地址: Index of /gnu/

下载tar.gz包

然后解压缩,

执行./configure命令,

执行make && make install 命令

autoreconf --install

./configure

configure: error: gelf.h missing!

yum install elfutils-libelf-devel

configure: error: json-c/json.h missing!

$ git clone https://github.com/json-c/json-c.git
$ mkdir json-c-build
$ cd json-c-build
$ cmake ../json-c   #See CMake section below for custom arguments

$ make
$ make test

$ make USE_VALGRIND=0 test#optionally skip using valgrind

$ sudo make install          #it could be necessary to execute make install

来自 <https://github.com/json-c/json-c>

make

corestripper.c:32:10: 致命错误:elfutils/version.h:没有那个文件或目录

yum install -y elfutils-devel

make install

使用

修改code路径

$ echo '|/usr/sbin/minicoredumper %P %u %g %s %t %h %e' | tee /proc/sys/kernel/core_pattern
$ echo 0x7fffffff | tee /proc/sys/kernel/core_pipe_limit

修改配置

{

#一组选项,指定如何转储以及转储哪些堆栈

    "stacks": {

        "dump_stacks": true,  #是否应进行堆栈转储。如果此选项为false,则忽略所有其他堆栈选项。

        "first_thread_only": false,  #是否只应转储崩溃线程的堆栈

        "max_stack_size": 0  #要转储的最大堆栈大小(以字节为单位)。0表示无限制。只转储堆栈区域的实际使用部分。如果堆栈由于max_stack_size选项而被截断,则会转储所用堆栈的最底部(即堆栈中包括导致核心转储的函数的部分)

    },

    #指定共享对象的一组选项,其虚拟内存区域也应转储,如果共享对象维护调试期间所需的静态堆栈外数据,这将非常有用

    "maps": {

            #要转储的共享对象名称, 名称可以包含用于通配符匹配的*字符

        "dump_by_name": [

            "*my_lib_to_debug*so*",

            "[vdso]"

        ]

    },

    #一组缓冲区,每个缓冲区指定应用程序中也应转储的全局数据

    "buffers": [

        {

            "symname": "my_allocated_struct", #全局变量/符号的名称

            "follow_ptr": true, #全局变量是否是指针,该指针指向的数据是否应该转储

            "data_len": 42 #全局变量的大小(以字节为单位)。如果follow_ptr为true,则这是指向的数据的大小

        },

        {

            "symname": "my_short",

            "follow_ptr": false,

            "data_len": 2,

            "ident": "my_short_data.bin" #以后用于标识二进制转储的可选字符串

        }

    ],

    #用于指定文件是否应使用压缩以及应使用何种类型的压缩

    "compression": {

        "compressor": "gzip",

        "extension": "gz",

        "in_tar": true

    },

    "dump_auxv_so_list": true, #是否应转储共享对象列表, 使用它来确定链接了哪些共享对象以及将它们映射到哪个地址

    "dump_pthread_list": true, #是否应转储pthread列表,使用它来识别和遍历所有线程

    "dump_robust_mutex_list": true, #是否应转储健壮互斥的列表, 使用它来标识共享内存中的互斥对象属性和状态

    "dump_scope": 8, #只有达到或低于此值的已注册转储才会被转储

    "live_dumper": false, #是否应触发所有已注册的.BR libminicoredumpr(7)应用程序

    "write_proc_info": true, #是否应将感兴趣的/proc文件复制到转储目录

    "write_debug_log": false, #否应将.BR minicoredumper(1)消息记录到转储目录中的“debug.txt”中。如果.BR syslog(3)在系统上不可用,则此选项特别有用

    "dump_fat_core": false #是否应转储所有虚拟内存区域。 这将生成一个单独的“fatcore”文件,该文件通常比默认的Linux.BR core(5)文件大。这实际上只对调试.BR minicoredumper(1)有用。

}

dump_auxv_s_list、 dump_phread_list、 dump_robust_mutex_list 选项通常应设置为true。它们为gdb提供了重要信息,并且需要相对较小的转储空间。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

docker 可视化工具操作说明 portainer

官网地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下载并安装容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

前端:让一个div悬浮在另一个div之上

使用 CSS 的 position 属性和 z-index 属性 首先&#xff0c;将第二个 div 元素的 position 属性设为 relative 或 absolute。这样可以让该元素成为一个定位元素&#xff0c;使得后代元素可以相对于它进行定位。 然后&#xff0c;将要悬浮的 div 元素的 position 属性设为 ab…

DOS 批处理 (二)

DOS 批处理 1. 基础 DOS 命令1.1 基础命令1.2 文件系统操作1.3 文件夹管理1.4 文件管理1.5 网络相关1.6 系统管理1.7 IF、FOR和NETIFFORNET 1. 基础 DOS 命令 command /? 查找帮助DOS命令不区分命令字母的大小写 C:\Users\Administrator>echo 1 1 C:\Users\Administrator…

SQL面试题,判断if的实战应用

有如下表&#xff0c;请对这张表显示那些学生的成绩为及格&#xff0c;那些为不及格 1、创建表&#xff0c;插入数据 CREATE TABLE chapter8 (id VARCHAR(255) NULL,name VARCHAR(255) NULL,class VARCHAR(255) NULL,score VARCHAR(255) NULL );INSERT INTO chapter8 (id, n…

嵌入式系统

嵌入式系统 目前国内一个普遍认同的嵌入式系统定义是&#xff1a;以应用为中心、以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。&#xff08;引用自《嵌入式系统设计师教程》&#xff09; …

点评项目——商户查询缓存

2023.12.7 redis实现商户查询缓存 在企业开发中&#xff0c;用户的访问量动辄成百上千万&#xff0c;如果没有缓存机制&#xff0c;数据库将承受很大的压力。本章我们使用redis来实现商户查询缓存。 原来的操作是根据商铺id直接从数据库查询商铺信息&#xff0c;为了防止频繁地…

一维相位解包裹

一维相位解包裹 本文首先介绍最简单的一维的位相解包裹算法。设W是包裹运算符&#xff0c;中是解包裹位相&#xff0c;是包裹的位相。则一维位相解包裹可表示为&#xff1a; 解包裹就是要选取正确的k,满足&#xff1a; 两个相邻像素位相的差值如下&#xff1a; 由式(2-1)和式(2…

JOSEF快速中间继电器DZK-916 4A AC220V板后嵌入式安装

系列型号 DZK-911快速中间继电器&#xff1b;DZK-912快速中间继电器&#xff1b; DZK-914快速中间继电器&#xff1b;DZK-916快速中间继电器&#xff1b; DZK-917快速中间继电器&#xff1b;DZK-918快速中间继电器&#xff1b; DZK-924快速中间继电器&#xff1b;DZK-934快速中…

德国进口高速主轴电机在机器人上的应用及选型方案

随着机器人技术的日新月异&#xff0c;高速主轴电机在机器人领域的应用也日趋广泛。德国进口的SycoTec高速主轴电机&#xff0c;以其高转速、高精度、高刚度的特点&#xff0c;在机器人的切割、铣削、钻孔、去毛刺等加工应用中发挥着关键作用。 一、高速主轴电机的特点 SycoT…

【项目问题解决】IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()

目录 lombok找不到符号问题修改 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()&#xff0c;无法使用lombok下应有的注解&#xff0c;一度怀疑是版本问题 …

什么是SPA(Single Page Application)?它的优点和缺点是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

JVM理解

1、JVM是什么&#xff1f; JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。 他是帮助我们将java代码 生成编译后 的 class 文件。 2、JRE、JDK和JVM 的关系 …

【文件上传系列】No.0 利用 FormData 实现文件上传、监控网路速度和上传进度(原生前端,Koa 后端)

利用 FormData 实现文件上传 基础功能&#xff1a;上传文件 演示如下&#xff1a; 概括流程&#xff1a; 前端&#xff1a;把文件数据获取并 append 到 FormData 对象中后端&#xff1a;通过 ctx.request.files 对象拿到二进制数据&#xff0c;获得 node 暂存的文件路径 前端…

【STM32】TIM定时器输入捕获

1 输入捕获 1.1 输入捕获简介 IC&#xff08;Input Capture&#xff09;输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变时&#xff08;上升沿/下降沿&#xff09;&#xff0c;当前CNT的值将被锁存到CCR中&#xff08;把CNT的值读出来&#xff0c;写入到…

【链表Linked List】力扣-109 有序链表转换二叉搜索树

目录 题目描述 解题过程 官方题解 题目描述 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输…

解决思维题的一些自我总结

目录 常见思维题类型 排序 区间问题 01串串 字符串串 位运算 gcd 与 lcm 质数相关 二元组 常见思维题类型 思维题很多都可以说是贪心、但贪心种类很多&#xff0c;具体怎么贪&#xff0c;重要的还是在于积累经验吧...有些东西也很难总结&#xff0c;以下算是我的碎碎念…

linux学习之详解文件

目录 1.先认识文件 2.c语言中常用文件接口 fopen&#xff08;打开文件&#xff09; 3.系统接口操作文件 open write 文件的返回值以及打开文件的本质 理解struct_file内核对象 了解文件描述符&#xff08;fd&#xff09;分配规则 重定向 dup接口 标准错误流 文件缓冲…

(NeRF学习)3D Gaussian Splatting Instant-NGP

学习参考&#xff1a; 3D Gaussian Splatting入门指南【五分钟学会渲染自己的NeRF模型&#xff0c;有手就行&#xff01;】 三维重建instant-ngp环境部署与colmap、ffmpeg的脚本参数使用 一、3D Gaussian Splatting &#xff08;一&#xff09;3D Gaussian Splatting环境配置…

ORA-600 kcbzib_kcrsds_1一键恢复

一个19c库由于某种原因redo损坏强制打开库报ORA-600 kcbzib_kcrsds_1错误 SQL> startup mount pfile?/database/pfile.txt; ORACLE instance started. Total System Global Area 859830696 bytes Fixed Size 9034152 bytes Variable Size 5…

通过K8S安装人大金仓数据库

1. 离线下载镜像&#xff0c;请点击 2. 官网下载镜像 https://www.kingbase.com.cn/xzzx/index.htm&#xff0c;根据自己的需求下载对应版本。 3. K8S需要的yaml清单 cat > kingbase.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata:name: kingbase-…