使用GDB(一):分析core.xxx文件常用方法

一、Linux生成core文件

当进程异常时如段错误退出时会产生core文件,当进程执行某处代码阻塞时,可以强制生成core文件。

1.1 core文件生成大小限制

  • ulimit -c,可查看生成core文件的大小,0表示未开启,unlimited表示无限制。
  • ulimit -c filesize,限制生成core文件的大小,ulimit -c 0表示不开启,ulimit -c 1000表示限制core文件限制为1000KBulimit -c unlimited无限制。

1.2 core文件生成路径

  • 默认路径为当前命令的执行路径,以下命令可查看:
    cat /proc/sys/kernel/core_pattern
    /sbin/sysctl kernel.core_pattern
    
  • 临时修改:修改/proc/sys/kernel/core_pattern文件,echo "/corefile/core" > /proc/sys/kernel/core_pattern可以将core文件统一生成到/corefile目录下。
  • 永久修改:使用sysctl -w name=value命令,/sbin/sysctl -w kernel.core_pattern=/corefile/core
  • 有的机器或docker使用/corefile/core或默认路径无法保存core文件(可能是权限问题?),这时候可以使用系统中已经存在的目录作为core文件生成路径,如/tmp/core

1.3 core文件生成文件名

  • 默认文件名为core,以下命令可查看:
    cat /proc/sys/kernel/core_pattern
    /sbin/sysctl kernel.core_pattern
    
  • 临时修改:修改/proc/sys/kernel/core_pattern文件,echo "core-%p-%e" > /proc/sys/kernel/core_pattern生成core文件名为core-pid-程序文件名
  • 永久修改:使用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时间(197011日计起的秒数)
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名(程序文件名)
    

1.4 程序崩溃没有core文件

可能是当前执行的命令没有权限改动core_pattern下指定的目录:

$ cat /proc/sys/kernel/core_pattern
core-%e-%p-%t
#或
/corefile/core-%e-%p-%t

可以试试修改core_pattern目录为:

echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

二、GDB查看core文件堆栈信息

2.1 方法一

  • gdb [exec file] [core file],启动gdb进入core文件,如gdb luajit-2.1.0-beta3 core;或者启动gdb,在gdb中使用file [exec file]命令和core-file [core file]

  • btwhere,可以定位到段错误在源程序中具体文件的具体位置。

    (gdb) bt
    #0  0x000000011f3bf954 in ?? ()
    #1  0x0000000000000000 in ?? ()
    Backtrace stopped: frame did not save the PC
    

2.2 方法二

  • gdb core.xx,调试某个core dump文件,比如gdb core.19122

  • set solib-search-path lib_dir,设置其他依赖库,类似Java需要其他依赖的Jar一样,需要设置其他依赖的动态库,我们环境往往是在set solib-search-path /lib64,下面的所有命令都需要在使用该命令的基础上进行。

  • bt,查看当前线程的栈信息

  • thread apply all bt,输出所有线程的详细栈信息,通常会由此查看是否有自己实现的类或者so库。一般会把所有线程的详细栈信息输出到一个文件里面如thread_info.txt,依次使用下面命令:

    set height 0
    set logging file thread_info.txt
    set logging on
    thread apply all bt
    set logging off
    

你可能感兴趣的:(工具及使用经验,gdb)