core文件是什么

核心文件(core file),也称为核心转存(core dump),是操作系统在进程运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。如对链表的新增和释放包括赋值等等,如出现不当操作都有可能造成程序崩溃。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。

core文件生成后的路径和名称

通过cat /proc/sys/kernel/core_pattern,可以查看core文件保存的位置和文件名格式

当程序core dump后发现确实在本地目录产生了core文件,但是如果程序多次core dump时,core文件会被覆盖,原因是每次core dump后生成的文件名默认都叫core,如果想在每次core dum时产生的core文件都带上进程号怎么操作,或者你想把内核转储文件保存到其他目录怎么办?

  1. 使用cat /proc/sys/kernel/core_uses_pid,查看生成的core文件名称是否添加pid作为扩展,可以通过修改这个文件中的值为1来修改生成的core文件的名称。

         如果为0,说明生成的core文件就是core文件
         如果为1,说明生成的core文件格式为core.xxxx;
    

2.通过修改kernel的参数,指定内核转储所生成的core文件的路径和文件名。
切换到root用户,执行#vim /etc/sysctl.conf ,然后在sysctl.conf文件中添加下面两句话:

       kernel.core_pattern = /home/smart/corefile/core-%e-%p
       kernel.core_uses_pid = 0

保存sysctl.conf文件后退出,并执行sysctl -p即时生效。

3.在 /home/smart/目录下先建立corefile文件夹,后面如果core dump时,就会在/home/smart/corefile/下产生以指定格式命名的内核转储文件。

注意:如果/proc/sys/kernel/core_uses_pid 这个文件的内容被配置成1,即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。

 以下是参数列表:

 %p-添加pid

 %u-添加当前uid

 %g-添加当前gid

 %s-添加导致产生core的信号

 %t-添加core文件生成时的unix时间

 %h-添加主机名

 %e-添加命令名

core文件的查看:

core文件需要使用gdb查看。

    方式1:

            gdb ./a.out

            core-file core.xxxx(core.xxxx就是core文件名)

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

    方式2:

            gdb -core=core.xxxx(core.xxxx就是core文件名)

            file ./a.out

            bt

     方式3:

            gdb -c core.xxxx(core.xxxx就是core文件名)

            file ./a.out

            bt

方式2、3两种命令的效果相同,但是有些环境下不生效,所以推荐使用方式1

            gdb -core=core.xxxx(core.xxxx就是core文件名)

            file ./a.out

            bt
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐