Linux生成core使用

Linux下产生并调试core文件 先看看我用的是个什么机器:

[root@localhost work]# uname -a

Linux localhost.localdomain 2.6.32-279.el6.i686 #1 SMP Wed Jun 13 18:23:32 EDT 2012 i686 i686 i386 GNU/Linux

 

再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。

[root@localhost work]# ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 15029

max locked memory       (kbytes, -l) 64

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 1024

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

 

写个简单的程序,看看core文件是不是会被产生。

[root@localhost work]# cat main.c

#include <stdio.h>

 

int main(void)

{

char *str = "hello";

str[0] = 'h';

return 0;

}

 

[root@localhost work]# gcc main.c -g -o main

[root@localhost work]# ./main

Segmentation fault (core dumped)

[root@localhost work]#  ls -l core.*

ls: cannot access core.*: No such file or directory

 

没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。

 

[root@localhost work]# ulimit -c 1024

[root@localhost work]# ulimit -a

core file size          (blocks, -c) 1024

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 15029

max locked memory       (kbytes, -l) 64

max memory size         (kbytes, -m) unlimited

open files                      (-n) 1024

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 1024

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited

 

[root@localhost work]# ./main

Segmentation fault (core dumped)

[root@localhost work]#  ls -l core.*

-rw------- 1 root root 155648 Jul  2 20:56 core.5860

 

注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,5860是该进程的PID。我们用GDB来看看这个core

 

[root@localhost work]#  gdb --core=core.5860

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-56.el6)

Copyright (C) 2010 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 "i686-redhat-linux-gnu".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Missing separate debuginfo for the main executable file

Try: yum --disablerepo='*' --enablerepo='*-debug*' install /usr/lib/debug/.build-id/b9/b3b663d93d2e0baab612b9ac21bdb91402dbeb

[New Thread 5860]

Core was generated by `./main'.

Program terminated with signal 11, Segmentation fault.

#0  0x080483a4 in ?? ()

(gdb) bt

#0  0x080483a4 in ?? ()

#1  0x003f6ce6 in ?? ()

#2  0x00000001 in ?? ()

#3  0xbf86f724 in ?? ()

#4  0x08048301 in ?? ()

(gdb)

 

此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:

(gdb) file ./main

Reading symbols from /work/main...done.

(gdb) bt

#0  0x080483a4 in main () at main.c:6

 

此时backtrace出来了。

(gdb) l

1#include <stdio.h>

2

3int main(void)

4{

5char *str = "hello";

6str[0] = 'h';

7return 0;

8}

 

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。

1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。

2.core文件的名称和生成路径

----------------------------

core文件生成路径:

输入可执行文件运行命令的同一路径下。

若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的core文件。如下:

[root@localhost work]# ls

1.txt  core.5860  main  main.c  main.map

 

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

2proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。

可通过以下命令修改此文件:

echo "/corefile/core-%e-%p-%t" > 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文件的查看

-----------------

core文件需要使用gdb来查看。

gdb ./a.out

core-file core.xxxx

使用bt命令即可看到程序出错的地方。

以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。

1gdb -core=core.xxxx

file ./a.out

bt

2gdb -c core.xxxx

file ./a.out

bt

 

4.开发板上使用core文件调试

-----------------------------

如果开发板的操作系统也是linuxcore调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PClinux下。

PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefixsolib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit

配置文件内容:

set solib-absolute-prefix YOUR_CROSS_COMPILE_PATH

set solib-search-path YOUR_CROSS_COMPILE_PATH

set solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH

handle SIG32 nostop noprint pass

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Linux系统中,可以使用gcore命令生成dump文件。gcore命令可以在运行中的进程中生成核心转储文件,以便在调试时使用使用gcore命令生成dump文件的步骤如下: 1. 找到需要生成dump文件的进程的进程ID(PID)。 2. 在终端中输入以下命令: gcore PID 其中,PID是需要生成dump文件的进程的进程ID。 3. 执行完上述命令后,系统会在当前目录下生成一个以进程ID为名称的dump文件,例如: core.12345 其中,12345是进程ID。 4. 使用gdb等调试工具打开生成的dump文件,进行调试。 需要注意的是,生成dump文件需要root权限。同时,dump文件可能会包含敏感信息,因此需要妥善保管。 ### 回答2: Linux生成dump文件是指在遇到系统故障、崩溃等异常情况时,将应用程序或是操作系统的可执行文件保存为一份dump文件,以供后续的分析和修复。一般情况下,生成dump文件的过程需要通过安装相应的调试工具和配置相关的参数来实现。 常见的Linux生成dump文件的工具有gdb和coredump,其中gdb是一款强大的调试工具,它提供了多种命令以及脚本支持,可以支持用户在线调试、分析程序执行过程中的状态。而coredump则是一种自动产生的dump文件机制,在程序遇到异常时,会自动将进程空间部分数据保存成core文件,方便后续调试。 在使用这些工具前,需要在程序源码编译时添加一些调试相关的选项,以生成正确的dump文件。例如,在使用gdb进行调试时,可以在编译时使用-g选项来生成调试信息,然后使用gdb命令打开可执行文件,进行调试。在使用coredump时,需要在系统内核设置coredump机制,可以使用sysctl命令配置相应的参数。 生成dump文件是一种非常有效的调试工具,它可以帮助我们快速地定位程序中的问题,并加快问题解决的速度。同时,需要注意的是,dump文件可能包含敏感信息,应该妥善保管以防泄漏。 ### 回答3: Linux生成dump文件是为了记录系统崩溃时的状态和信息,以便进行调试和分析。生成dump文件的过程可以通过以下几个步骤来实现: 第一步:安装和配置kdump kdump是Linux系统的一个内核崩溃转储的工具,需要先安装和配置好该工具。可以通过以下命令进行安装和配置: yum -y install kexec-tools 在/etc/kdump.conf配置文件中可以设置生成dump文件的存储位置和大小等参数。 第二步:启用kdump服务 启用kdump服务后,系统在遇到内核崩溃时就会自动转储dump文件。可以通过以下命令来启用kdump服务: systemctl enable kdump.service systemctl start kdump.service 在kdump服务启动后,可以通过以下命令来检查kdump服务的状态: systemctl status kdump.service 第三步:触发内核崩溃并生成dump文件 在系统发生内核崩溃后,dump文件会被自动转储并存储在预先配置好的路径中。可以通过以下命令来手动触发一个内核崩溃: echo c > /proc/sysrq-trigger 在触发内核崩溃后,可以使用以下命令来检查dump文件是否已经生成: ls -lh /var/crash/ 如果dump文件已经生成,可以使用以下命令来查看和分析dump文件: crash /path/to/vmlinux /path/to/dumpfile 以上就是Linux生成dump文件的步骤,通过这些步骤可以方便地生成和分析dump文件,从而更好地进行系统调试和故障排查。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值