linux core文件调试

在完成公司项目,测试进程的时候,经常会发现日志到了某一段特定的代码的时候就没了,进程直接退出,也没有捕获到任何的异常信息,如果日志打印的较多还可能比较容易发现问题,如果日志较少,就很难进行进一步的查错了。

但是发现在该目录下生成了一个core文件,可以帮助我们查找程序崩溃的原因。

1. 什么是core文件

在linux系统下,如果进程不能正常运行,就可能会产生core文件。core文件就是当前内存状态的一个映像,同时加上一些调试信息。

bug和操作系统或硬件的保护机制都会导致程序异常终止,操作系统会kill掉这些进程并产生core文件。

2. 为什么我的linux不会生成core文件

使用 ulimit -a 命令可以查看当前系统资源的一些限制信息,如下图所示:

其中的core file size 如果设置为0的话,当程序崩溃的时候就不会产生core文件。

#设置core文件大小为无限

ulimit -c unlimited

#阻止系统生成core文件

ulimit -c 0

注意:这条命令只在当前生效,如果希望永久生效,就需要在.bash_profile中加上这条命令。

3. 设置Core Dump的核心转储文件目录和命名规则

/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0。需要有超级用户的权限才能进行修改。

/proc/sys/kernel/core_pattern 可以设置格式化的 core文件保存位置或文件名,默认的是|/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e。需要修改的话,可以使用如下命令:

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 - insertcoredumping executable name into filename 添加命令名

4. 使用core文件

在linux上可以使用gdb来调试core文件,格式为:

gdb [程序名] [core文件名]

如果你不知道这个core文件到底是哪个程序生成的,可以使用

gdb -c[core 文件名] 来查看生成此core文件的程序名。

显示结果中可以看出程序名,可能像下面这样

Core wasgenerated by `./test‘.

之后进入gdb调试状态,输入 where就可以看到程序崩溃时堆栈信息(当前函数之前的所有已调用函数的列表(包括当前函数),我们可以借此找出是程序中的哪个部分导致了程序崩溃。注意:在编译程序的时候要加入选项-g。

5. 一个简单的例子

编译如下的程序:

#include <iostream>

using namespace std;

class A

{

public:

int a;

};

void fun()

{

A*t = new A();

t->a = 1;

cout << t->a << endl;

delete t;

delete t;

}

int main()

{

fun();

return 0;

}

执行:

./test

 

结果为:

1

*** glibc detected *** ./test: double freeor corruption (fasttop): 0x09fd7008 ***

======= Backtrace: =========

/lib/libc.so.6[0x3ebe31]

/usr/lib/libstdc++.so.6(_ZdlPv+0x22)[0x43fc552]

./test[0x8048705]

./test[0x8048712]

/lib/libc.so.6(__libc_start_main+0xe6)[0x391d26]

./test[0x8048611]

======= Memory map: ========

00327000-00328000 r-xp 00000000 00:000          [vdso]

00334000-00351000 r-xp 00000000 08:02926955    /lib/libgcc_s-4.4.7-20120601.so.1

00351000-00352000 rw-p 0001d000 08:02926955    /lib/libgcc_s-4.4.7-20120601.so.1

00355000-00373000 r-xp 00000000 08:02926876     /lib/ld-2.12.so

00373000-00374000 r--p 0001d000 08:02926876     /lib/ld-2.12.so

00374000-00375000 rw-p 0001e000 08:02926876     /lib/ld-2.12.so

0037b000-0050c000 r-xp 00000000 08:02926877     /lib/libc-2.12.so

0050c000-0050e000 r--p 00191000 08:02926877     /lib/libc-2.12.so

0050e000-0050f000 rw-p 00193000 08:02926877     /lib/libc-2.12.so

0050f000-00512000 rw-p 00000000 00:00 0

00543000-0056b000 r-xp 00000000 08:02926889     /lib/libm-2.12.so

0056b000-0056c000 r--p 00027000 08:02926889     /lib/libm-2.12.so

0056c000-0056d000 rw-p 00028000 08:02926889     /lib/libm-2.12.so

0434d000-0442e000 r-xp 00000000 08:02155001     /usr/lib/libstdc++.so.6.0.13

0442e000-04432000 r--p 000e0000 08:02155001     /usr/lib/libstdc++.so.6.0.13

04432000-04434000 rw-p 000e4000 08:02155001     /usr/lib/libstdc++.so.6.0.13

04434000-0443a000 rw-p 00000000 00:00 0

08048000-08049000 r-xp 00000000 08:02419326    /home/wcl/fate/src/app/test/test

08049000-0804a000 rw-p 00000000 08:02419326    /home/wcl/fate/src/app/test/test

09fd7000-09ff8000 rw-p 00000000 00:000          [heap]

b7719000-b771c000 rw-p 00000000 00:00 0

b7727000-b772a000 rw-p 00000000 00:00 0

bfd2a000-bfd3f000 rw-p 00000000 00:000          [stack]

Aborted (core dumped)

因为我们对一个已经delete过了的指针再次delete,所以程序down掉了,可以看到在当前目录下已经生成了一个core.4377的文件,4377就是之前程序启动的PID。

调试core文件:

gdb test core.4377

进入gdb调试后,键入where命令:

(gdb) where

#0 0x00327424 in __kernel_vsyscall ()

#1 0x003a5b11 in raise () from /lib/libc.so.6

#2 0x003a73ea in abort () from /lib/libc.so.6

#3 0x003e59d5 in __libc_message () from /lib/libc.so.6

#4  0x003ebe31in malloc_printerr () from /lib/libc.so.6

#5  0x043fc552 in operator delete(void*) () from/usr/lib/libstdc++.so.6

#6  0x08048705 in fun() ()

#7  0x08048712 in main ()

可以很明显的看出是在main函数中调用fun函数,之后delete指针的时候出错了,后面的函数调用栈就是程序输出错误信息的部分了,和我们的用户代码无关。到这一步,我们就能推断是是fun()这个函数中delete某个指针的时候出现了错误,就可以有的放矢地查找具体的问题了。

时间: 2024-10-12 13:28:46

linux core文件调试的相关文章

linux下core文件调试方法(转载)

转自于:http://blog.csdn.net/fcryuuhou/article/details/8507775 在程序遇到段错误不寻常退出时,一般是访问内存出错.但是不会给出程序哪里出现的问题,这个时候就需要core文件来帮助调试. 内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 1)使用ulimit -c命令可查看core文件的生成开关.若结果

Linux core 文件介绍

Linux core 文件介绍 http://www.cnblogs.com/dongzhiquan/archive/2012/01/20/2328355.html 1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以下命令来阻止系统生成core文件:ulimit -c 0下面的命令可以检查生成core文件的选项是否打开:ulimit -a该命令将显示

linux core文件设置

http://blog.csdn.net/ctthuangcheng/article/details/8963551 linux core文件设置 分类: Linux OS Debugging Technique2013-05-23 09:51 1446人阅读 评论(0) 收藏 举报 在Linux中,一般当进程非正常退出时,会生成一个core文件,这个文件是进程猝死时内存的转储文件,也称为core dump. 查看Linux脚本解析方式: echo $0 1.检验core是否打开 以see/se

Linux下core文件调试

1,ulimit -a查看默认参数 2,ulimit -c 1024 设置core文件大小,如果超过1024个blocks,则不会产生core文件 注:tune2fs -l /dev/sda8 输出分区信息,包括block大小,此处为4096 程序: 编译:g++ -g test.cpp 3, gdb  --core=core(core文件名) gdb -c core 4,bt 发现没有任何堆栈信息,调用file 通告 5,再次调用bt 输出堆栈信息 可知,错误发生在程序fun()函数中的第8行

开发板上使用core文件调试

转载:http://www.nginx.cn/1521.html 如果开发板的操作系统也是linux,core调试方法依然适用.如果开发板上不支持gdb,可将开发板的环境(依赖库).可执行文件和core文件拷贝到PC的linux下.在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径.有一种建立配置文件的方法,不需要每次启动

(转)Linux core 文件介绍与处理

1. core文件的简单介绍在一个程序崩溃时,它一般会在指定目录下生成一个core文件.core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的. 2. 开启或关闭core文件的生成用以下命令来阻止系统生成core文件:ulimit -c 0下面的命令可以检查生成core文件的选项是否打开:ulimit -a该命令将显示所有的用户定制,其中选项-a代表“all”. 也可以修改系统文件来调整core选项在/etc/profile通常会有这样一句话来禁止产生core文件,通常这种设置是合

GDB Core,gdb 调试大全,core文件调试

编译: gcc -g -o hello hello.c gdb 调试: 基本 gdb 命令. 命 令 描 述 小结:常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where) breakpoint 在程序中设置一个断点 cd 改变当前工作目录 clear 删除刚才停止处的断点 commands 命中断点时,列出将要执行的命令 continue 从断点开始继续执行 delete 删除一个断点或监测点:也可与其他命令一起使用 display 程序停

Linux core 文件

http://blog.csdn.net/mr_chenping/article/details/13767609 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 --------------------------------- 1)使用ulimit -c命令可查看core文件的生成开关.若结果为0,则表示关闭了此功能,不会生成c

linux下如何产生core,调试core

linux下如何产生core,调试core 摘自:http://blog.163.com/[email protected]/blog/static/19554784201131791239753/ 在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息).使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数. 1.core文件的生成开关和大小限制 1)使用ulimit -c命令可查看core文件的生成开关.若结果为0,则表示关闭了此