注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学习笔记

正确的方法如同学习书法,开始的时候要临摹,临摹好了然后创造自己的风格。

 
 
 

日志

 
 

[C/C++笔记]core dump含义及调试方法  

2011-12-24 16:03:06|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

From:http://haobing2005.blog.163.com/blog/static/466678620097181052322/

1. core dump的含义
       core dump又叫核心转储。当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。

2. core文件的名称和生成路径
       若系统生成的core文件不带其它任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
$ echo "1" > /proc/sys/kernel/core_uses_pid
2)/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
$ echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
       可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%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时间
%h - insert hostname where the coredump happened into filename 添加主机名
%e - insert coredumping executable name into filename 添加命令名

3. 为什么没有core文件生成
       有时候程序down了,但是core文件却没有生成。.core文件的生成跟你当前的环境设置有关系,可以用以下的语句设置一下,然后再运行程序便生成了.core文件。
$ ulimit -c unlimited
       core文件生成位置一般与运行程序的路径相同,文件名一般为core进程。

4. 用gdb查看core文件
       发生core dump之后,用gdb进行查看core文件的内容,以定位文件中引发core dump的行。
       格式:gdb [exec file] [corefile]
如:
$ gdb ./test test.core
       在进入gdb后,用bt命令查看backtrace以检查发生程序运行到哪里。
$ gdb -c core 文件路径[应用程序路径]
       进去之后输入where回车,就可以显示程序在哪一行当掉的,在那个函数中。
       用gdb调试实例:
$ cat main.c

#include <stdio.h>
#include <stdlib.h>
#include "mylib.h"

int main (void)
{
    int ret = -1;
    int a = 10, b = 20;
    ret = add(a, b);
 
 printf("The result is: %d\n", ret);
 
 return 0;
}

$ cat Makefile 

CC = gcc
LD = gcc
all:
 $(CC) mylib.c -g -I. -fPIC -shared -o libmylib.so
 $(CC) main.c -g -I. -L. -lmylib -o test
clean:
 rm *.so test

$ cat mylib.c 

#include <stdlib.h>
#include "mylib.h"

int add(int x, int y)
{
    char* pc = NULL;
 int i=10;
    pc = &i;
    return x + y;
}

$ cat mylib.h 

#ifndef __MY_LIB_H__
#define __MY_LIB_H__

int add(int x, int y);

#endif //__MY_LIB_H__

$ make
gcc mylib.c -g -I. -fPIC -shared -o libmylib.so
gcc main.c -g -I. -L. -lmylib -o test
$ ./test
./test: error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
这个错误表明程序在运行阶段不能找到相应的动态库文件,此时需要通过环境变量 LD_LIBRARY_PATH 来指定运行期动态库的搜索目录,我们的动态库就在当前目录,如下:
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
$ ls
libmylib.so  main.c  Makefile  mylib.c  mylib.h  test
系统在默认情况下core文件的大小设置为0,换句话讲也就是不产生core文件。我们可以通过 ulimit 命令来修改core文件的大小,unlimited表示不限制core文件的大小,如下:
$ ulimit -c unlimited
$ ./test
Segmentation fault (core dumped)
$ ls
core  libmylib.so  main.c  Makefile  mylib.c  mylib.h  test
用gdb进行查看
$  gdb test core
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0  0xb77f737c in add (x=10, y=20) at mylib.c:7
7     *pc = 10;
错误发生在mylib.c的第7行,即*pc=10,pc的值未初始化。
  评论这张
 
阅读(2996)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017