博客
关于我
GDB调试之core文件(如何定位到Segment fault)
阅读量:489 次
发布时间:2019-03-06

本文共 1003 字,大约阅读时间需要 3 分钟。

core dump又称为核心转储,是指在程序运行过程中发生异常时,操作系统将程序当前内存状况存储到一个core文件中的过程。当程序因段错误(Segment fault)或其他异常退出时,由内核发送SIGSEGV信号,从而触发core dump。这类错误通常与指针操作相关,经常出现在数组越界、字符串操作不当以及多线程环境中的竞态条件等情境中。

1. 常见引发core dump的原因

  • 内存访问越界

    • 数组越界:使用错误的下标访问数组,可能导致访问超出数组边界。
    • 字符串操作不当:在字符串操作中,未正确判断字符串结束符,导致读写越界。
    • 危险的字符串函数:使用如strcpy、strcat等函数进行读写操作,容易引发越界错误。应优先使用安全版本的函数如strncpy、strlcpy等。
  • 多线程环境中的线程不安全操作

    • 多线程程序若在未锁保护的情况下操作全局变量或共享数据,可能导致竞态条件引发段错误。
  • 非法指针使用

    • 使用空指针进行操作,直接导致段错误。
    • 随意将内存块转换为结构体指针进行操作,除非确保内存对齐,否则可能因bus error导致core dump。
  • 堆栈溢出

    • 使用过大局部变量,导致栈溢出,破坏系统内存结构,引发异常退出。
  • 配置系统限制core dump

    • 系统默认可能禁用core dump功能,需检查并设置相关参数。通过ulimit -c unlimited可以临时开启,或者在.bashrc中添加该命令使其生效。
  • 2. 调试core dump问题

    发生core dump后,可以使用gdb工具分析core文件以定位错误点。例如:

    gcc -g test.c
    ./a.out

    在生成的core文件中,可以通过gdb进行分析:

    gdb a.out core.1234

    通常core文件会生成在当前工作目录下。如需自定义存储路径,可在/etc/sysctl.conf中设置:

    kernel.core_pattern = /var/core/%t-%e-%p-%c.core

    3. 预防措施

  • 安全使用内核函数:避免strcpy、strcat等危险函数,改用安全版本。
  • 加锁保护:在多线程环境中对共享数据进行锁定。
  • 合理分配内存:避免使用过大局部变量,防止栈溢出。
  • 检查指针操作:确保指针转换符合内存对齐要求。
  • 配置支持core dump:确保系统允许生成core文件,避免因系统限制而无法获取关键信息。
  • 转载地址:http://peldz.baihongyu.com/

    你可能感兴趣的文章
    Mysql学习总结(58)——深入理解Mysql的四种隔离级别
    查看>>
    Mysql学习总结(59)——数据库分库分表策略总结
    查看>>
    Mysql学习总结(5)——MySql常用函数大全讲解
    查看>>
    Mysql学习总结(60)——并发量大、数据量大的互联网业务数据库设计规范总结
    查看>>
    Mysql学习总结(61)——MySQL优化之DBA级优化整理汇总
    查看>>
    Mysql学习总结(62)——MySQL连接com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link问题
    查看>>
    Mysql学习总结(63)——Mysql数据库架构方案选择与分析
    查看>>
    Mysql学习总结(64)——Mysql配置文件my.cnf各项参数解读
    查看>>
    Mysql学习总结(65)——项目实战中常用SQL实践总结
    查看>>
    Mysql学习总结(66)——设置MYSQL数据库编码为UTF-8
    查看>>
    Mysql学习总结(67)——MYSQL慢查询日志
    查看>>
    Mysql学习总结(68)——MYSQL统计每天、每周、每月、每年数据 SQL 总结
    查看>>
    Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
    查看>>
    Mysql学习总结(6)——MySql之ALTER命令用法详细解读
    查看>>
    Mysql学习总结(70)——MySQL 优化实施方案
    查看>>
    Mysql学习总结(71)——MySQL 重复记录查询与删除总结
    查看>>
    Mysql学习总结(71)——数据库介绍(MySQL安装 体系结构、基本管理)再回顾
    查看>>
    Mysql学习总结(72)——MySQL 开发者开发,设计规范再总结
    查看>>
    Mysql学习总结(73)——MySQL 查询A表存在B表不存在的数据SQL总结
    查看>>
    Mysql学习总结(74)——慢SQL!压垮团队的最后一根稻草!
    查看>>