zoukankan      html  css  js  c++  java
  • linux下core文件设置与查看

    转自:https://blog.csdn.net/dingqinghui/article/details/77855330?locationNum=9&fps=1

    程序异常退出时,内核会生成一个core文件(是内存映像以及调试信息)。可以通过使用gdb来查看core文件,指示出导致程序出错的代码所在的文件和行数。

     1、查看系统中core文件生成的开关是否打开

        1)使用ulimit -c命令可查看core文件的生成开关,若结果为0,则便是关闭了此功能,不会生成core文件。

    2、设置core文件生成

        1)使用命令ulimit -c filesize命令

                若ulimit -c unlimited 则标识此core文件的大小不受限制

                若指定filesize,如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件,在调 

                试此core文件时,gdb会提示错误。

        2)但是若想整个系统中生效则在shell里面设置是不行的,方法如下:

           (1)编辑/root/.bash_profile文件,在其中加入ulitmit -S -c unlimited

           (2)source /root/.bash_profile

    3、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)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命令即可看到程序出错的地方。
    以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。
    1)gdb -core=core.xxxx
    file ./a.out
    bt
    2)gdb -c core.xxxx
    file ./a.out
    bt

      

    也可以通过gdb 程序名 core文件名

     如:gdb test core.8482

     然后通过bt或者where查看程序崩溃时的堆栈信息

    注意:在编译程序的时候要加入选项-g。

    linux环境下调试多线程,总觉得不像.NET那么方便。这几天就为找一个死锁的bug折腾好久,介绍一下用过的方法吧。

    多线程如果dump,多为段错误,一般都涉及内存非法读写。可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成core文件。  
    ulimit -c unlimited
    这样的话死掉的时候就可以在当前目录看到core.pid(pid为进程号)的文件。接着使用gdb:
    gdb ./bin ./core.pid
    进去后,使用bt查看死掉时栈的情况,在使用frame命令。

    还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:
    gcore pid(调试进程的pid号)
    手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。
    最后,说一句,静心看代码,捶胸顿足是没有用的。

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

    使用C/C++语言开发程序时,当程序crash的时候产生core dump文件对于调试程序是很有帮助的。在Redhat Linux系统中默认是不生成core dump文件的,这是因为在/etc/profile文件中有这样一行

    ulimit -S -c 0 > /dev/null 2>&1


    如何打开core dump呢?最简单的方法是用户在自己的~/.bash_profile中加入ulimit -S -c unlimited > /dev/null 2>&1,这样设置后允许当前用户生成没有大小限制的core dump文件。此外还有两种系统级修改生成core dump的方法。

    第一种方法是修改/etc/profile,把ulimit那一行改为

    ulimit -S -c unlimited > /dev/null 2>&1

    这样设置后系统允许所有用户生成没有大小限制的core dump文件。这样做的优点是不需要重起系统,缺点是无法控制只让某些用户生成core dump文件。

    第二种方法是修改/etc/security/limits.conf文件。很多系统上限都可以通过修改这个文件改变,如最大子进程个数,最大打开文件数等等。这个文件有详细的注释,对如何修改这个文件做了说明。如果想对所有用户打开core dump,可以加入一行

    * soft core 0

    如果只想对某些用户或用户组打开core dump,可以加入

    user soft core 0或@group soft core 0

    注意如果通过修改/etc/security/limits.conf文件打开core dump,还需要注释掉/etc/profile中的ulmit那一行
    #ulimit -S -c 0 > /dev/null 2>&1
    这样修改的优点是可以针对特定用户或特定组打开core dump文件,缺点是需要重起系统。

    最后说一下生成core dump文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。core dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改core dump文件的位置(如希望生成到/tmp/cores目录下)

    echo "/tmp/cores/core" > /proc/sys/kernel/core_pattern

  • 相关阅读:
    Linux下hook指定库
    一行一行往上爬
    高可用数据同步方案-SqlServer迁移Mysql实战
    Hystrix核心基础
    Fastjson解析多级泛型的几种方式—使用class文件来解析多级泛型
    面试大全之JVM篇
    云原生下的CICD
    学习Raft算法的笔记
    Go语言下的线程模型
    分布式事务解决方案以及 .Net Core 下的实现(上)
  • 原文地址:https://www.cnblogs.com/fanblogs/p/12654588.html
Copyright © 2011-2022 走看看