文章目录

  • 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:
    #
    #<domain>        <type>  <item>  <value>
    #
    #下面一行位置为我增加的
    #第一列<domain>为用户限制
    #第二列<type>为修改限制的类型是软件还是硬件,这里因为是内核相关文件,则是soft
    #第三列<item>为文件属性
    #第四列<value>对属性具体限制的数值
    *               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 <http://gnu.org/licenses/gpl.html>
    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:
    <http://www.gnu.org/software/gdb/bugs/>...
    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("<fldb> line:%d\n",__LINE__);
    969             printf("<fldb> i:%d\n",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;
    

g-gdb调试core文件相关推荐

  1. 解决gdb 调试 core 文件函数名显示为问号的问题

    关于gdb调试core文件总是一堆问号的问题 问题描述:已经在编译选项中加入了-g,但是查看core文件时,还是一堆问号,使用的命令为:gdb -c core 解决方案:由于gdb -c core这样 ...

  2. coredump gdb 调试_Linux下如何使用gdb调试core文件

    1.core文件 当程序运行过程中出现Segmentation fault (core dumped)错误时,程序停止运行,并产生core文件.core文件是程序运行状态的内存映象.使用gdb调试co ...

  3. Linux 下使用 gdb 调试 core 文件

    1.core文件 当程序运行过程中出现段错误(Segmentation Fault),程序将停止运行,由操作系统把程序当前的内存状况存储在一个 core 文件中,即核心转储文件(Coredump Fi ...

  4. GDB调试core文件样例(如何定位Segment fault)

    core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (Linux中如果内存越界会收到SIG ...

  5. 用gdb调试core文件

    GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成 ...

  6. Gdb 调试core文件详解

    一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要 ...

  7. GDB调试core文件详解

    一,什么是coredump 我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要 ...

  8. gdb 调试core文件

    @1:gdb exe文件 core文件 @2:bt 查看栈 @3:f N 进入某个函数,其中N是整数,是 bt 命令展示的栈号 @4:x/[nfu]  <addr> 展示某个内存地址的变量 ...

  9. PostgreSQL的学习心得和知识总结(二十四)|CentOS环境 配置生成coredump程序崩溃内存转储文件及gdb调试core文件

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.使用GDB分析core dump文件,点击前往 2.详解coredump,点击前往 3.PostgreSQL数据库仓库链 ...

  10. gdb 调试core 文件

    vi gdb_error.c #include<stdio.h> int main() {int *temp=NULL;*temp=10;return 0;} ulimit -c unli ...

最新文章

  1. .Net Discovery 系列之六--深入浅出.Net实时编译机制(下)
  2. Python 使用readability 提取网页标题
  3. CSS父级子级学习总结
  4. python函数高级运用
  5. [导入]从函数RND的使用想到的!
  6. Oracle体系结构之控制文件的多路复用技术
  7. Hibernate:1对1关系总结。
  8. 中值滤波器及均值滤波器
  9. 十大热门编程语言:不死 Java、不朽 C/C ++、新贵 Python
  10. 数学速算法_孩子数学计算老出错?复习阶段,家长赶紧和孩子一起找准原因!...
  11. admincp db.php,${discuz-admincp_db.php-vul} 命令执行漏洞 修复方案
  12. docker安装nfs文件服务所需镜像,centos7安装nfs所需的安装包
  13. 大连大学计算机科学与技术研究生毕业工资,大学研究生毕业的你,现在一个月的月薪多少?现实让人想哭!...
  14. 残差网络ResNet到ResNeXt解读,最强ResNeXt预训练模型已开源及如何使用
  15. 每日启程——2019.12.11日(草木有本心,何求美人折)
  16. 读书笔记-精准努力-励志本身就已经让你爽了以为自己真这样做了
  17. 数字图像隐写术之JPEG 隐写分析
  18. 如何多人协作编辑文档
  19. 【js课设】电子画板01
  20. Jmeter 性能测试之阶梯式场景、波浪式场景

热门文章

  1. 用easyui动态创建一个对话框
  2. 【转】android错误 aapt.exe已停止工作的解决方法
  3. 我已经喜欢上了Python
  4. GHOST还原教程详细
  5. 怎么在vs2010中使用ActiveX Test Container(转)
  6. 从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误
  7. mysql killed进程不结束_php和mysql连接方式(短 长 池)
  8. C语言 字符型操作(就自己做个笔记储存一下)
  9. php amqp扩展安装,php扩展AMQP,安装报错解决
  10. android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...