• 获得进程的内核转储core


    预备

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    main.cpp
    #include 
    
    using namespace std;
    
    int main(int argc,char *argv[])
    {
        int *a = NULL;
        *a = 0x1;
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    CMakeLists.txt
    cmake_minimum_required(VERSION 3.10)
    
    project(main)
    
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall")
    
    INCLUDE_DIRECTORIES(./)
    
    AUX_SOURCE_DIRECTORY(./ MAIN)
    
    add_executable(main ${MAIN})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    启用内核转储

    大多数Linux发行版本默认关闭内核转储功能

    (ulimit) 启用和设置转储大小

    ulimit -a // 查看设置效果

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    ulimit -c

    -c 表示内核转储文件的大小限制, 限制为0, 内核转储无效

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    ulimit -c unlimited // 不限制内核转储文件的大小,只是临时生效

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    ulimit -c 1073741824 // 设置core上限大小

    永久生效需要在shell的启动脚本/etc/bashrc、~/.bashrc或者/etc/profile等地方写入

    echo “ulimit -c unlimited” >> /etc/profile

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    内核转储的位置

    /proc/sys/kernel目录下看当前core的配置, /proc这个目录是一个虚拟文件系统,它放置的数据都是在内存中,本身不占有磁盘空间,vi不能直接修改

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    默认情况下是在程序当前目录

    kernel.core_pattern需要没配置, 或者就是core
    在这里插入图片描述

    kernel.core_uses_pid = 1
    1:添加pid作为扩展名,生成的core文件名称为core.pid
    0:不添加pid作为扩展名,生成的core文件名称为core

    在这里插入图片描述

    自定义目录

    修改/etc/sysctl.conf

    kernel.core_pattern = /var/lib/systemd/coredump/%t-%e-%p-%c

    kernel.core_uses_pid = 0 // 设置什么都不生效

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    运行sysctl -p让新增设置生效, 再运行./main

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    格式符
    格式符说明
    %%%字符本身
    %p被转储进程的进程ID(PID)
    %u被转储进程的真实用户ID (real UID)
    %g被转储进程的真实组ID(real GID)
    %s引发转储的信号编号
    %t转储时刻(从1970年1月1日 0:00 开始的秒数)
    %h主机名
    %e可执行文件名
    %c转储文件的大小上限(内核版本2.6.24以后可以使用)

    辅助程序自动压缩内核转储文件

    在目录/usr/local/sbin下增加core_help脚本, 并增加权限
    #!/bin/sh
    
    exec gzip -> /var/lib/systemd/coredump/$1-$2-$3-$4.core.gz
    
    • 1
    • 2
    • 3

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    kernel.core_pattern可以加入管道符, 启动用户模式辅助程序

    管道符(|) 后面可以写程序名

    1. 修改/proc/sysctl.conf

    kernel.core_pattern = |/usr/local/sbin/core_helper %t %e %p %c

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    2. sysctl -p 新配置生效
    3.转储文件被压缩

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 相关阅读:
    MySQL----函数
    WinEdt引用参考文献
    基于springboot的张仲景药房(药店)管理系统
    Linux下C++开发笔记--CMakeLists.txt重要指令和CMake常用变量
    grafana graphite statsd搭建安装部署 实时监控_亲测成功
    【Python入门指北】服务器信息清洗
    Linux常见的指令合集
    每日3题(3)-检查整数及其两倍数是否存在
    python爬虫hook定位技巧、反调试技巧、常用辅助工具
    Ubuntu20运行SegNeXt代码提取道路水体(一)——从零开始运行代码过程摸索
  • 原文地址:https://blog.csdn.net/zbbzb/article/details/132958752