1.介绍什么是core
2. 如何设置ubuntu 系统生产core文件
3.生成调试信息
4. gdb调试core文件
5.导致产生core文件信号列表
1、什么是core
gdb+core的方式就可以很容易的定位异常问题位置,尤其程序崩溃的原因.
core 叫做核心转储,它是进程运行过程中突然崩溃那一刻的内存快照.操作系统在程序发生异常并且异常 在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个core文件里.
该文件也是二进制文件,可以使用gdb、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打开分析里面的具体内容。
2、手动完成系统配置,让系统产生core文件
一般情况系统没有设置产生core文件的配置,这就需要我们手动完成配置,帮我们分析程序崩溃的原因,甚至查找到程序崩溃在某一个函数和某一行代码。否则系统ulimit的值默认为0 ,程序崩溃的时候不会产生core文件。
常用命令:
ulimit -a 查询core文件大小
ulimit -c 1000000 设置core文件大小为1000000字节;
ulimit -c unlimit 不能限制core文件的大小;
(core文件比较大,我们一般遇到的core文件大多在300M左右,这个应该因系统而异)
建议尽量不要对core文件大小进行限制;
2.1.设置core文件不限制大小的配置操作:
当前用户有效:在环境变量中添加命令:
ulimit -c unlimited //不限制文件大小
也可以通过设置当前用户下的.bashrc 文件配置,使得当前用户永久有效:
$ vim .bashrc
//在文件底部添加:
ulimit -c unlimited
//保存后,环境变量生效
$ source .bashrc
2.2. 设置core文件名称样式
通过设置/proc/sys/kernel/core_pattern格式来保存core文件生产位置和文件名
%%:相当于%
%p:相当于<pid>
%u:相当于<uid>
%g:相当于<gid>
%s:相当于导致dump的信号的数字
%t:相当于dump的时间
%e:相当于执行文件的名称
%h:相当于hostname
配置文件内容: core-%e-%p-%t
下面操作需要root用户权限才可以操作:
也可以通过下面的命令完成配置:
echo "core-%e-%p" > /proc/sys/kernel/core_pattern
这种情况产生的core文件,就在与程序相同目录下面产生;
如果需要指定core产生的目录位置,则可以下面的操作
echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern
产生的core文件统一的放到/tmp下面
3.运行程序,如果程序崩溃就会产生core文件
4.利用gdb调试工具,调试core文件
第一步通过终端输入: gdb 可执行程序名称 匹配的core文件名称;
第二步 进入gdb调试对话状态,再输入bt的命令,就会打印出详细的程序崩溃的位置和上下文的详细信息;
大多数都能分析出原因,主要分析程序崩溃的情况,至于内存是否泄露无法检测。
5.导致产生core文件的信号:
SIGQUIT:终端退出符
SIGILL:非法硬件指令
SIGTRAP:平台相关的硬件错误,现在多用在实现调试时的断点
SIGBUS:与平台相关的硬件错误,一般是内存错误
SIGABRT:调用abort函数时产生此信号,进程异常终止
SIGFPE:算术异常
SIGSEGV:segment violation,无效内存引用
SIGXCPU:超过了cpu使用资源限制(setrlimit)
SIGXFSZ:超过了文件长度限制(setrlimit)
SIGSYS:无效的系统调用