精华内容
下载资源
问答
  • Core Dump

    2021-03-08 11:47:54
    Linux程序Segmentation fault (core dumped) gdb调试coredump(使用篇) gdb调试coredump(使用篇)
    展开全文
  • core dump

    2020-12-18 20:47:00
    core dump当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中(core文件),这种行为就叫做 Core Dump 或者叫做 ‘核心转储’,利用 coredump 可以帮助我们快速定位程序...

    core dump

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中(core文件),这种行为就叫做 Core Dump 或者叫做 ‘核心转储’,利用 coredump 可以帮助我们快速定位程序崩溃位置
    ulimit -c 查看是否开启,如果输出为0,则没有开启。需要执行 ulimit -c unlimited 开启core dump功能。开启后执行ulimit -c输出unlimited
    在配置文件中设置core文件的名称和生成路径。没有进行设置的话,默认生成的core文件不带其它任何扩展名称,全部命名为core。新的core文件生成将覆盖原来的core文件 。
    用gdb同时调试运行程序和相应的core文件,可以复现程序崩溃时的场景,定位到具体程序崩溃的位置,且能看到具体的错误,分析前后的变量,找出问题的原因。

    基本GDB命令

    为了定位问题,常常需要进行单步跟踪,设置断点之类的操作。

    下边列出了GDB一些常用的操作。

    • 启动程序:run
    • 设置断点:b 行号|函数名
    • 删除断点:delete 断点编号
    • 禁用断点:disable 断点编号
    • 启用断点:enable 断点编号
    • 单步跟踪:next (简写 n)
    • 单步跟踪:step (简写 s)
    • 打印变量:print 变量名字 (简写p)
    • 设置变量:set var=value
    • 查看变量类型:ptype var
    • 顺序执行到结束:cont
    • 顺序执行到某一行: util lineno
    • 打印堆栈信息:bt
    展开全文
  • coredump

    2019-09-17 10:49:32
    一,什么是coredump 二,coredump文件的存储位置 core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core,大家可以通过下面的命令看到core文件的存在位置: cat /proc/sys/kernel/core_pattern ...

    一,什么是coredump
    二,coredump文件的存储位置
    core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core,大家可以通过下面的命令看到core文件的存在位置:

    cat  /proc/sys/kernel/core_pattern
    

    缺省值是core
    通过下面的命令可以更改coredump文件的存储位置,若你希望把core文件生成到/data/coredump/core目录下:

       echo /data/coredump/core > /proc/sys/kernel/core_pattern
    

    我们通过修改kernel的参数,可以指定内核所生成的coredump文件的文件名。例如,使用下面的命令使kernel生成名字为core.filename.pid格式的core dump文件:

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

    三,如何判断一个文件是coredump文件?
    readelf命令
    file命令进行快速判断
    四,产生coredum的一些条件总结

    1,内存访问越界
    
      a) 由于使用错误的下标,导致数组访问越界。
    
      b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
    
      c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。
    
     2,多线程程序使用了线程不安全的函数。
    
    应该使用下面这些可重入的函数,它们很容易被用错:
    
    asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n)ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c)getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c)fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c)getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3)getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n)nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3)getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c)getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c)getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)
    
     3,多线程读写的数据未加锁保护。
    
    对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成coredump
    
     4,非法指针
    
      a) 使用空指针
    
      b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump。
    
     5,堆栈溢出
    
    不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。
    
    ulimit  -c unlimited 
    

    五,coredump产生的几种可能情况
    六,利用gdb进行coredump的定位
    一步:首先需要一个进程的coredump文件

    1、 ps -fax|grep                 进程名称 找到进程的pid
    2、gdb -p pid                     调试进程
    3、gcore coredump名称        则生成core文件
    

    第二步:找出coredump文件的应用程序

    1、gdb -c corefile   使用gdb调试core文件
    2、info auxv          索引31对应的是core文件的应用程序
    

    第三部:gdb使用应用程序调试coredump文件

    gdb  coredump应用程序  coredump文件     调试coredump文件 
    

    通过以上三步就可以调试coredump文件了
    通过以下命令调试coredump文件

    info threads 显示所有线程
    bt 显示线程堆栈信息
    thread thread_num   切换线程
    frame num  切换栈
    info r 显示当前帧的寄存器信息 (每一帧的寄存器信息都是不相同的)
    readelf应用coredump
    readelf -h 读取coredump文件头
    readelf -wl 读取应用程序debug_line
    readelf -wf 读取应用程序fde和cie信息
    
    展开全文
  • Coredump

    2020-03-21 15:18:53
    Linux内核源码 Documentation/sysctl/kernel.txt core_pattern: ...core_pattern is used to specify a core dumpfile pattern name. . max length 128 characters; default value is "core" . core_patter...

    Linux内核源码 Documentation/sysctl/kernel.txt core_pattern:

    core_pattern:

    core_pattern is used to specify a core dumpfile pattern name.
    . max length 128 characters; default value is "core"
    . core_pattern is used as a pattern template for the output filename;
      certain string patterns (beginning with '%') are substituted with
      their actual values.
    . backward compatibility with core_uses_pid:
            If core_pattern does not include "%p" (default does not)
            and core_uses_pid is set, then .PID will be appended to
            the filename.
    . corename format specifiers:
            %<NUL>  '%' is dropped
            %%      output one '%'
            %p      pid
            %P      global pid (init PID namespace)
            %i      tid
            %I      global tid (init PID namespace)
            %u      uid
            %g      gid
            %d      dump mode, matches PR_SET_DUMPABLE and
                    /proc/sys/fs/suid_dumpable
            %s      signal number
            %t      UNIX time of dump
            %h      hostname
            %e      executable filename (may be shortened)
            %E      executable path
            %<OTHER> both are dropped
    . If the first character of the pattern is a '|', the kernel will treat
      the rest of the pattern as a command to run.  The core dump will be
      written to the standard input of that program instead of to a file.

    脚本

    #!bin/bash

    #/proc/<pid>/maps
    cat /proc/$1/maps > /tmp/maps_of_$1

    #/proc/<pid>/smaps
    cat /proc/$1/smaps > /tmp/smaps_of_$1

    #coredump
    dd > /tmp/core_$1_$2_$3

    #gzip

    gzip > /tmp/core_$1_$2_$3

     

     

    ulimit -c unlimited
    
    echo "|/usr/local/coredump.sh %p %e %s" > /proc/sys/kernel/core_pattern

     

    参考资料:

    https://www.cnblogs.com/justin-y-lin/p/11327224.html

    https://www.cnblogs.com/arnoldlu/p/11160510.html

    http://www.brendangregg.com/blog/2016-08-09/gdb-example-ncurses.html

    展开全文
  • CoreDump

    2019-01-30 16:59:10
    Linux Core Dump ​ 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,272
精华内容 6,108
热门标签
关键字:

coredump