一、段错误的形式:

在编程中以下几类做法容易导致段错误,基本上是错误地使用指针引起的。

1)访问系统数据区,尤其是往系统保护的内存地址写数据最常见就是给一个指针以0地址。

2)内存越界(数组越界,变量类型不一致等): 访问到不属于你的内存区域。

解决方法:我们在用C/C++语言写程序的时候,内存管理的绝大部分工作都是需要我们来做的。实际上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定位这些"段错误"的语句。

二、下面将就以下的一个存在段错误的程序介绍几种调试方法:

test的代码如下:

[root@localhost TEST]# cat test.c -n1   #include <stdio.h>2   int main(void)3 {4      printf("111");5       printf("222");6       int *ptr = NULL;7      *ptr = 1;8 }

1)使用命令    gcc -g -rdynamic test.c 然后gdb调试

[root@localhost TEST]# gcc -g -rdynamic test.c

 1.1)查找段错误:
这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上“-g -rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:

[root@localhost TEST]# gcc -g -rdynamic test.c
[root@localhost TEST]# gdb  ./a.out
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/桌面/TEST/a.out...done.
(gdb) r
Starting program: /root/桌面/TEST/./a.out Program received signal SIGSEGV, Segmentation fault.
0x00000000004007d2 in main () at test.c:7
7       *ptr = 1;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-105.el7.x86_64
(gdb)

不用一步步调试我们就找到了出错位置d.c文件的第4行,其实就是如此的简单。

从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal),我们知道SIGSEGV默认handler的动作是打印”段错误"的出错信息,并产生Core文件,由此我们又产生了方法二。

2)使用命令   ulimit 命令

 1.1)查找段错误:

[root@localhost TEST]# ulimit -c
0
[root@localhost TEST]# ulimit -c 1000
[root@localhost TEST]# ./a.out
段错误(吐核)
[root@localhost TEST]# ls
a.out  core.15180  test  test.c
[root@localhost TEST]# gdb ./a.out core.15180
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-80.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/桌面/TEST/a.out...done.
[New LWP 15180]
Core was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x00000000004007d2 in main () at test.c:7
7       *ptr = 1;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-105.el7.x86_64

如何解决 “ 段错误(吐核) ” ???相关推荐

  1. linux段错误吐核怎么办,CentOS命令

    网络配置 # 重启网络管理器 $ service network restart # 查看IP地址 $ ip addr # 修改IP配置 $ cd /etc/sysconfig/network-scr ...

  2. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题

    一.core文件介绍以及用途: 1.core文件是什么? core文件包含了程序运行时的内存状态.寄存器状态.堆栈指针.内存管理信息以及各个函数使用堆栈信息等等: 当程序运行过程中出现段错误(Segm ...

  3. linux core文件调试,Linux程序调试助手–core,解决段错误!

    出现问题,不知道怎么解决,出现段错误,解决不了.那试一下core文件信息吧! 采用core文件的方法 1.core文件在什么位置创建? 在进程当前工作目录的下创建.通常与程序在相同的路径下.但如果程序 ...

  4. c++如何解决段错误 (核心已转储)

    在后端优化中遇到了段错误 (核心已转储)问题,寻求解决方法. 首先通过不断的注释部分代码,运行,注释,运行,找到一个大概的范围是错在哪一块. 这类问题只能说根本原因是内存的非法操作.建议生成内存段错误 ...

  5. linux程序运行段错误,Linux下段错误调试技巧

    更新于2019.04.17 我们写的程序, 尤其是C/C++程序有时候会段错误, 而且往往发生在部署环境而非调试环境, 对问题定位带来很大困难. 这时一般有两种方法来解决问题, 一种是生成core d ...

  6. 段错误(核心已转储)的问题原因

    一个困扰已久的问题,今天终于明白了. core,核心(线圈),没有半导体之前,使用线圈内存,指代内存. 可执行文件是分段存储的,加载进内存也是分段的,如代码段.数据段.堆.栈等,段错误的原因往往是碰到 ...

  7. 段错误排查方法与防御性措施~

    什么是段错误 首先我们需要知道什么是段错误,才能对症下药. 段错误是一种在程序运行时发生的错误,通常是由于程序试图访问不在其地址空间范围内的内存引起的. 例如,当一个程序访问空指针或者已经被释放的内存 ...

  8. Ubuntu20.04出现段错误核心已转储问题解决方案

    作为一个半路出家的linuc用户,coredump这个问题太让人抓狂了,网上找了好多都是不全面,不适应或者看不懂:现在终于解决了,记录一下防止以后出现还是无解,同时也分享给大家,希望大家能少踩一些坑. ...

  9. [Linux] 什么是 段错误(吐核)?

    段错误 我们在Linux环境下编程中,有时执行编译好的文件时会出现段错误(吐核),这是经常出现的一个错误. 它是什么意思呢? 这个错误过程中都有哪些文件? 与VS中IDE直接报错有何不同?我们将通过本 ...

最新文章

  1. Python3学习笔记-字符串和编码
  2. 26.27.28.29.极区图(南丁格尔玫瑰图)、维恩图 (Venn diagram)、面状图(Area chart)、树地图
  3. //随机生成1位大写字母\小写字母\数字
  4. Kafka2.0生产者客户端使用
  5. mongoDB操作详细
  6. c语言从键盘输入asdfg输出asdfg,C语言复习题参考答案.doc
  7. html调用python_flask之模板html中调用python函数方法
  8. Python中fastapi关于异常或者错误的处理
  9. window.onload和jQuery的ready函数区别
  10. iOS微信运动 刷分
  11. 自定义Mac睡眠时间,保持运行状态
  12. 悟空CRM(PHP版本)安装教程
  13. linux-ubuntu16.04下搭建java运行环境
  14. DevOps元素周期表
  15. 让画面契合音乐节拍——BeatEdit
  16. Cisco 2960交换机密码恢复
  17. 计算机无法启动无法修复工具,windows资源保护无法启动修复服务的解决方法
  18. 微信小程序 java校友录交流系统springboot
  19. Avoid adding reactive properties to a Vue instance or its root $data at runtime - declare it upfront
  20. 数据库删改都不会,还能被录用:女程序员要求这么宽松?

热门文章

  1. 网络编程(原始套接字)
  2. 网络编程学习笔记(recvfrom很奇怪的一个地方)
  3. 【机器学习】周志华 读书笔记 第一章 绪论
  4. IPC$概念及入侵方式研究
  5. setAdapter(adapter)空指针nullPointer 解决办法
  6. 需要熟悉的几个调试命令:objdump/pmap/ldd/stace
  7. CGContextRef学习笔记
  8. DB2 9 利用启示(733 测验)认证指南,第 7 部分: Java 编程(5)
  9. 理解OpenCV中的宏定义 CVAPI(函数返回类型)
  10. android调试更换模拟器,在模拟器上调试 Android 磨损