linux 下 gdb core dump 分析程序崩溃原因

原博客:http://hnhujun3023.blog.163.com/blog/static/105440217201291552338564/
在linux中使用C/C++语言开发程序时,当程序crash的时候产生core dump文件对于调试程序是很有帮助的,特别对于
难以复现的crash,准确定位crash的位置对分析crash原因更有意义。

下面讲述如何配置linux系统在程序crash时产生core dump文件及如何根据core文件查找问题的所在,并做相应的分析和调试。
一、core dump 配置
1、查看系统限制  
root@(none):/# ulimit -a
core file size        (blocks, -c) 0
data seg size         (kbytes, -d) unlimited
file size             (blocks, -f) unlimited
max locked memory     (kbytes, -l) 32
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size          (512 bytes, -p) 8
stack size            (kbytes, -s) 8192
cpu time             (seconds, -t) unlimited
max user processes            (-u) 1024
virtual memory        (kbytes, -v) unlimited

其中 core file size        (blocks, -c) 0 一行表示产生的core dump文件的最大大小,为0时表示不
产生core dump文件,可以通过 ulimit命令来改变此设置。

2、修改core dump文件最大值
ulimit -c 10

设置core dump文件最大为10个块

3、修改core dump 文件生成的位置及名称
echo '/tmp/core_%e_%s_%t' > /proc/sys/kernel/core_pattern

产生的core dump文件将保存在/tmp目录下,文件名字为core_%e_%s_%t,下面为%符号后字母的具体含义
%% A single % character
%p PID of dumped process
%u real UID of dumped process
%g real GID of dumped process
%s number of signal causing dump
%t time of dump (seconds since 0:00h, 1 Jan 1970)
%h hostname (same as 'nodename' returned by uname(2))
%e executable filename

上述配置完成后程序crash时就会产生core dump文件。

二、简单实例
要想利用core dump分析程序crash,程序编译时必须带-g选项。下面代码为程序app的部分代码:

5085: void begin_page_key_process(lcdnode *pnode,int code,int value)
5086: {
5087:    if(pnode){
5088:        lcdnode *p=NULL;
5089:        p->key_process(pnode,code, value);//此处执行会crash
5090:        pnode->leave_action(pnode);
5091:        goto_child(pnode);
5092:    }
5093: }


程序crash后产生的core dump文件为core.909,下面利用gdb分析程序crash的原因:
app为带-g的编译的程序,core dump文件必须要和原程序一起才能分析,要不无法得到程序符号表信息,从而无法
定位crash位置。
root@(none):# ./gdb  app  core.909
GNU gdb STMicroelectronics/Linux Base 6.8-25
Copyright (C) 2008 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 "arm-926ejs-linux-gnueabi"...
Cannot access memory at address 0x400226b0
(gdb) 

加载后 显示的Cannot access memory at address 0x400226b0 大致表示crash的原因为不能访问内存地址0x400226b0 。
输入where命令查询详细信息:
(gdb)where
#0  0x000408d0 in begin_page_key_process (pnode=Cannot access memory at address 0x44148dcc
) at lcdkeyprocess.c:5089
Cannot access memory at address 0x44148de0
(gdb)

显示中at lcdkeyprocess.c:5089 表示程序crash的位置为lcdkeyprocess.c的5089行,即示列程序段中的
p->key_process(pnode,code, value);语句。



结束语:
    在程序测试中,特别是需要长期测试的程序,使用core dump分析定位程序crash原因是非常方便的。关于core dump的详细资料请查看gdb调试手册。

猜你喜欢

转载自blog.csdn.net/fengzhongluoleidehua/article/details/79808905