博客
关于我
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 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>
    mysql-5.7.18安装
    查看>>
    MySQL-Buffer的应用
    查看>>
    mysql-cluster 安装篇(1)---简介
    查看>>
    mysql-connector-java.jar乱码,最新版mysql-connector-java-8.0.15.jar,如何愉快的进行JDBC操作...
    查看>>
    mysql-connector-java各种版本下载地址
    查看>>
    mysql-EXPLAIN
    查看>>
    MySQL-Explain的详解
    查看>>
    mysql-group_concat
    查看>>
    MySQL-redo日志
    查看>>
    MySQL-【1】配置
    查看>>
    MySQL-【4】基本操作
    查看>>
    Mysql-丢失更新
    查看>>