一、Linux生成core文件
当进程异常时如段错误退出时会产生core文件,当进程执行某处代码阻塞时,可以强制生成core文件。
1.1 core文件生成大小限制
ulimit -c
,可查看生成core文件的大小,0
表示未开启,unlimited
表示无限制。ulimit -c filesize
,限制生成core文件的大小,ulimit -c 0
表示不开启,ulimit -c 1000
表示限制core文件限制为1000KB
,ulimit -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时间(由1970年1月1日计起的秒数) %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]
。 -
bt
或where
,可以定位到段错误在源程序中具体文件的具体位置。(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