• 问题介绍

在使用ubuntu的过程中,为了给vim编辑器配置编辑插件,自python官网下载了python3.6进行配置。

但是在配置过程中,运行pip时发生了“段错误(核心已转储)”,以下是解决实践。

  • 什么是段错误

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIGSEGV信号,然后就会core dump)。产生段错误的原因大致上有三类:访问不存在的内存地址、访问系统保护的内存地址和访问只读的内存地址。

  • 解决步骤

    • 设置core文件大小限制

      • 使用ulimit -a命令查看core文件大小限制

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        core file size              (blocks, -c) unlimited      //这里是core文件的大小限制
        data seg size (kbytes, -d) unlimited
        scheduling priority (-e) 0
        file size (blocks, -f) unlimited
        pending signals (-i) 60348
        max locked memory (kbytes, -l) 1940728
        max memory size (kbytes, -m) unlimited
        open files (-n) 1024
        pipe size (512 bytes, -p) 8
        POSIX message queues (bytes, -q) 819200
        real-time priority (-r) 0
        stack size (kbytes, -s) 8192
        cpu time (seconds, -t) unlimited
        max user processes (-u) 60348
        virtual memory (kbytes, -v) unlimited
        file locks (-x) unlimited
      • 使用如果为0,使用ulimit -c unlimited取消限制

    • core文件的生成地址

      • 通常情况下core文件的生成地址为报错程序的目录下,但是在ubuntu中core文件的生成路径有所变化

        • 使用cat /proc/sys/kernel/core_pattern查看文件生成目录

          1
          |/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E    //返回的路径
        • 但是在这个路径下我们找不到core文件,主要是因为ubuntu官方的apport.service服务,自动生成崩溃报告。

        • 因此,我们需要先关闭服务,修改生成地址以便寻找文件

          1
          2
          3
          4
          5
          6
          7
          8
          //启用错误报告服务
          sudo systemctl enable apport.service
          //or
          sudo service apport start
          //关闭错误报告服务
          sudo systemctl disable apport.service
          //or
          sudo service apport stop
        • 设置路径

          echo "/home/boy/corefile/core-%e-%p-%t"> /proc/sys/kernel/core_pattern

        • 再次运行即可在设定的corefile文件夹内看见生成的core文件

    • 使用GDB进行测试