首页 > g-gdb调试core文件

g-gdb调试core文件

文章目录

        • core文件
        • 判读是否为core文件
        • 打开系统 core dump
        • 修改core文件的保存路径
        • gdb调试core文件


最近初步了解了一下core 文件,已经如何将gdb工具与core文件结合调试出现段错误的程序

core文件

core是指操作系的程序统核心。当我们的程序在操作系统上运行异常崩溃时,操作系统会将此时系统内存状态报存下来,放入一个core文件,这个过程叫做core dump,也即是核心转储。该过程可以理解为操作系统对内存的快照,保存的内容除了基本内存信息之外还包括寄存器信息(程序指针,栈指针),内存管理信息,程序运行状态信息等。core文件能够快速帮助开发者定位出很难发现的程序异常问题。

判读是否为core文件

一般core文件是以core开头的,

  • 使用命令readelf读取存储该文件的的elf加载表头信息,其中包含core file的信息

    readelf -h /tmp/core-hcli-17503-1556000117
    ELF Header:Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class:                             ELF64
    Data:                              2's complement, little endian
    Version:                           1 (current)
    OS/ABI:                            UNIX - System V
    ABI Version:                       0
    Type:                              CORE (Core file)  #文件类型为core文件
    Machine:                           Advanced Micro Devices X86-64
    Version:                           0x1
    Entry point address:               0x0
    Start of program headers:          64 (bytes into file)
    Start of section headers:          0 (bytes into file)
    Flags:                             0x0
    Size of this header:               64 (bytes)
    Size of program headers:           56 (bytes)
    Number of program headers:         112
    Size of section headers:           0 (bytes)
    Number of section headers:         0
    Section header string table index: 0
    
  • 使用file命令也可以看到core属性

    file /tmp/core-hcli-17503-1556000117 |grep core
    /tmp/core-hcli-17503-1556000117: ELF 64-bit LSB core file x86-64, version 1 (SYSV), SVR4-style, from '/b_iscsi/bn_cli/hcli ceph disk add --name ceph -s abcdef -l 10.192.55.180 INTEL'
    

打开系统 core dump

使用命令ulimit -c [blocks]

  • ulimit -c查看当前系统core文件的大小限制

    [root@node1 ~]# ulimit -c0 
    

    这个时候操作系统的core dump是关闭的,此时如果当前系统程序异常终止也不会生成core文件

  • ulimit -c 1024 限制当前系统的core文件大小为1024(blocks),记住这里的blocks为操作系统块大小,一般默认为512B,即这里限制core文件大小不超过1024 * 512 B

  • ulimit -c unlimited 对操作系统生成的core文件大小不做限制

  • 使用以上命令打开core dump只会对当前终端有效,如果想要永久生效,需要更改core dump配置文件如下:

    vim /etc/security/limits.conf

    增加如下内容

    #Each line describes a limit for a user in the form:
    #
    #            
    #
    #下面一行位置为我增加的
    #第一列为用户限制
    #第二列为修改限制的类型是软件还是硬件,这里因为是内核相关文件,则是soft
    #第三列为文件属性
    #第四列对属性具体限制的数值
    *               soft    core         unlimited
    

    使以上配置文件生效需确保PAM认证配置文件中添加pam_limits.so库,同时sshd的登录服务配置中PAM模块状态为启用USEPAM yes

    #确保ssh服务启动是会加载PAM认证模块
    cat /etc/ssh/sshd_config|grep UsePAM
    UsePAM yes
    

    同时在如下配置文件中加入PAM的limits库

    #在centos下该库是在lib64目录下,如果该配置中存在加载该库的语句则不用添加
    vim /etc/pam.d/login
    session    required     /lib64/security/pam_limits.so
    

    以上配置正常的话只需要重新登录一下终端,/etc/security/limits.conf中的修改即可生效,我们在ulimit -c中可以看到更改过的结果,且该结果对任何登录终端都生效。

修改core文件的保存路径

  • 默认生成的core文件保存在可执行文件路径下,文件名即为core
  • 通过修改/proc/sys/kernel/core_uses_pid文件让core文件名自动加上进程的pid号变为core.pid

    执行echo 1 > /proc/sys/kernel/core_uses_pid
  • 修改/proc/sys/kernel/core_pattern修改core文件的文件名和生成路径

    执行命令echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern则将生成的core文件目录放在/tmp目录下,同时文件名为core-命令名-pid-时间
    #如下文件
    /tmp/core-ceph_osd_daemon-10089-1556277405
    /tmp/core-ceph_osd_daemon-13233-1556352109
    /tmp/core-ceph_osd_daemon-14787-1556276292
    /tmp/core-ceph_osd_daemon-17754-1556275923
    

gdb调试core文件

  • 使用gdb 可执行文件绝对路径 core文件路径进行调试,如下

    gdb /root/ceph_osd_daemon /tmp/core-ceph_osd_daemon-22685-1556352590

    进入调试终端,输入bt即可打印程序异常的函数调用栈,使用list + 异常函数或者list + 代码行号查看出错源码位置,如果还想要继续进行代码断点以及变量跟踪,则可以进一步调试。使用gdb 可执行文件绝对路径,进行b line设置断点进行单步调试
    [root@node1 ~]# gdb /root/ceph_osd_daemon /tmp/core-ceph_osd_daemon-22685-1556352590
    GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-51.el7
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later 
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-redhat-linux-gnu".
    For bug reporting instructions, please see:
    ...
    Reading symbols from /root/ceph_osd_daemon...done.
    [New LWP 22685]
    Core was generated by `/root/ceph_osd_daemon'.
    Program terminated with signal 11, Segmentation fault.
    #0  0x00007f086dadd76b in __strcmp_sse42 () from /lib64/libc.so.6
    #我这里系统的libc库版本较低,所以debuginfo要求需要安装高版本C库即可
    Missing separate debuginfos, use: debuginfo-install glibc-2.17-222.el7.x86_64
    (gdb) bt #查看函数调用栈
    #0  0x00007f086dadd76b in __strcmp_sse42 () from /lib64/libc.so.6
    #1  0x00000000004041f3 in get_min_value (buff=0x7fffaa8fe700 "14 2", p_infos_a=0x7fffaa8fe300) at ceph_osd_daemon.c:970
    #2  0x000000000040464c in get_max_out_num (osds=0x7fffaa8fea90) at ceph_osd_daemon.c:1033
    #3  0x0000000000404e97 in ceph_daemon_exec () at ceph_osd_daemon.c:1180
    #4  0x000000000040501b in main (argc=1, argv=0x7fffaa902db8) at ceph_osd_daemon.c:1221
    (gdb) list 970 #查看出错的源代码位置
    965             for (i=0; NULL != p_infos_a[i]; i++){
    966             //for (i=0; i < pool_flag - 1 && NULL != p_infos_a[i]; i++){
    967             //for (i=0; i < pool_flag && strlen(p_infos_a[i]); i++){
    968             //printf(" line:%d
    ",__LINE__);
    969             printf(" i:%d
    ",i);
    970                 if (!strcmp(p_infos_a[i]->pool_id,tmp_id)) {
    971                     strcpy(p_infos_a[i]->min_size,tmp_redu);
    972                     }
    973             }
    974             return;
    

更多相关:

  •   .net core已经出来很长一段时间了,没有很好的学习过,现在工作不那么忙了,参考官方文档,在这里记录自己的学习过程!   ASP.NET Core 是一个跨平台的高性能开源框架,用于生成基于云且连接 Internet 的新式应用程序。 使用ASP.NET Core,可以:创建 Web 应用程序和服务、IoT 应用和移动后端。在...

  • 本文来自 运维人生 ,作者:fly是个稻草人链接:http://www.ywadmin.com/?id=76误删除linux系统文件了?不用急,本文将给你一个恢复linux文件的方法,让你轻松应对运维中的各风险问题。方法总比问题多~说在前面的话针对日常维护操作,难免会出现文件误删除的操作。大家熟知linux文件系统不同win有回收...

  • 原文来自SecIN社区—作者:WiHat0x00 什么是WebShell渗透测试工作的一个阶段性目标就是获取目标服务器的操作控制权限,于是WebShell便应运而生。Webshell中的WEB就是web服务,shell就是管理攻击者与操作系统之间的交互。Webshell被称为攻击者通过Web服务器端口对Web服务器有一定的操作权限,而...

  • 断电时文件系统发生了什么?硬盘又发生了什么?下一次开机时写到一半的文件在系统层面还在吗?在底层还在吗?更进一步的, 文件系统如何保证事务性, 会不会存在某种极端情况导致例如最后几个bit还没写完, 文件系统却认为它成功了的情况?回答不限任何文件系统,谢谢!下面是「北极」的回复分享断电的一瞬间,很多事情是无法确定的:1. 你无法确定...

  • 接到项目需求。需要搭建一个页面进行交互,慢慢来b (2).jpg使用python django框架进行页面的搭建在项目文件下打开窗口,输入命令;django-admin startproject helloword#在文件helloword/helloword/创建view.py在view.py文件中输入以代码from django....

  • 常见的错误集合解决方案(一)No.1提示错误'Microsoft.VC90.CRT,version="9.0.21022.8"把Microsoft.NET Framework 3.5.1下面的全部勾选上。No.2解决Qt Designer设计的图标但是VS生成不显示问题描述:在Qt designer中为菜单栏和工具栏设计的图标,但是...

  • 文章目录1. 解决问题2. 应用场景3. 实现方式C++实现C语言实现4. 缺点5. 和其他三种创建模式的对比(单例,工厂,建造者) 1. 解决问题 如果对象的创建成本较大,而同一个类的不同对象之间的差别不大(大部分字段相同),在这种情况下,我们可以利用已有对象(原型)进行赋值(拷贝)的方式,创建新的对象,从而达到节省对象创...

  • 混合osd的部署 先部署所有的ssd 在/etc/ceph.conf中最后添加ssd做osd的block大小如下: 比如部署中有两个ssd,则添加 [osd.0] bluestore_block_size = xxxx [osd.1] bluestore_block_size = xxx 如上的size大小计算如下,如ssd容量...

  • 文章目录Pool创建ec pool创建副本pool创建Pool参数创建根故障域及添加osd其他命令Tier相关 Pool创建 ec pool创建 创建profile ceph osd erasure-code-profile set $profile_name k=$k m=$m crush-failure-domain...

  • 文章目录简介使用OSD相关操作PG相关操作对象相关操作总结 简介 ceph-objectstore-tool工具,能够操作到ceph最底层的数据,包括pg,对象层级。它能够对底层pg以及对象相关数据进行获取、修改。并能够对一些问题pg和对象进行简单修复。所以使用该工具进行操作的时候需要谨慎(涉及到修改的操作最好备份一份数据)...

  • 文章目录ceph版本:环境配置:异常问题:问题解决:总结 ceph版本: ceph 12.2.1 环境配置: tier_pool 16个分区大小800G 的osd容量 3副本 data_pool 32个4T盘 3副本 异常问题: ps:在分布式存储中遇到任何问题都不要先去通过重设存储节点,清除磁盘数据来解决,一定要...