• 待整理-coredump


    Linux下如何产生coredump(gdb调试用)


    任务发生异常,需要记录遗言信息,利用gdb调试,因此需要记录coredump文件。
    设置查看:
    在root用户下执行sysctl -a | grep core,查看core文件的配置是否正确
    命令设置:
    1)使用命令 ulimit -c unlimited 设置coredump文件可以使用最大空间;
      或去vi /etc/security/limits.conf修改
    2)/proc/sys/kernal/core_pattern 可以设置coredump产生的路径和文件名格式。如果不修改,默认在程序执行目录下产生。
      或使用命令修改:
        sysctl -w kernel.core_pattern=/core/core.%e.%p
    如果设置了上述两点,还是不能产生coredump,可能是以下原因:
    1) 有些信号量默认是不产生coredump的,可以用 man signal 看一下。
    2) 硬盘空间不够了,coredump需要占用很大的硬盘空间(上G的空间);
    3) ulimit -c 命令只在当前terminal上有效,也就是程序启动的terminal设置该命令才有效。该命令无效,当然就不能产生coredump了。

    segfault

    段错误通常是由于解除引用一个未初始化或非法值的指针引起的。以发生频率为序,最终可能导致段错误的常见编程错误是:

    1 、 坏指针错误 :在指针赋值之前就用它来引用内存;或者向库函数传递一个坏指针 ( 如果调试器显示系统程序中出现了段错误,很可能并不是系统程序引起的段错误,问题可能就出现在自己的代码中 ) ;或者指针被释放后还继续访问它的内容。

    2 、 改写错误 :越过数组边界写入数据,在动态分配的内存空间以外写入数据,或改写一些堆管理数据结构 ( 在动态分配的内存之前的区域写入数据就很容易发生这种情况 ) 。

    3 、 指针释放引起的错误 :释放同一块内存两次,或释放一块未曾使用 malloc 分类的内存,或释放一个无效的指针。一个极为常见的与释放内存有关的错误就是在 for(p=start;p;p=p->next)  这样的循环中迭代一个链表,并在循环体内使用  free(p)  这样的语句。这样,在下一次循环迭代时,程序就会对已经释放的指针进行解除引用操作,从而导致不可预料的结果。 


    bit2:  值为 1 表示是用户态程序内存访问越界,
    值为 0 表示是内核态程序内存访问越界 

    bit1:  值为 1 表示是写操作导致内存访问越界,
    值为 0 表示是读操作导致内存访问越界 

    bit0:  值为 1 表示没有足够的权限访问非法地址的内容,
    值为 0 表示访问的非法地址根

  • 相关阅读:
    企业架构-发布在线文档【企业架构框架-TOGAF v0.2.pdf】
    以后我的blog部分主题在其他地方写,留意者请继续关注!
    2010年3月blog汇总:企业架构、团队管理
    参加了两天QCon会议,你有什么感觉?
    DDD - 使用聚合(Aggregate)来设计类库
    发布【报表引擎设计.pdf】
    关心你的blog统计数据 给博客增加免费统计服务
    推荐:C2C文档销售与分享社区豆丁
    个人管理 - 后续的个人管理系列文章列表,大家一起来提提建议
    BABOK 需求获取(Elicitation)
  • 原文地址:https://www.cnblogs.com/bugutian/p/4902576.html
Copyright © 2020-2023  润新知