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

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/fanblogs/p/12654588.html
Copyright © 2011-2022 走看看