首页 > 其他分享 >为什么会出现段错误

为什么会出现段错误

时间:2024-03-25 11:01:41浏览次数:28  
标签:为什么 segmentation 错误 segfault3 访问 memory 内存地址 出现

为什么会出现段错误?
介绍
一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这里贴一个对于“段错误”的准确定义(参考 Answers.com):

A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.

Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.

On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.
段错误产生的原因
访问不存在的内存地址
访问系统保护的内存地址
访问只读的内存地址
栈溢出
段错误信息的获取
程序发生段错误时,提示信息很少,下面有几种查看段错误的发生信息的途径。

dmesg
dmesg 可以在应用程序 crash 掉时,显示内核中保存的相关信息。如下所示,通过 dmesg 命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈指针地址、错误代码、错误原因等。

$ dmesg
-g
使用 gcc 编译程序的源码时,加上-g 参数,这样可以使得生成的二进制文件中加入可以用于 gdb 调试的有用信息。

$ gcc -g -o segfault3 segfault3.c
nm
使用 nm 命令列出二进制文件中的符号表,包括符号地址、符号类型、符号名等,这样可以帮助定位在哪里发生了段错误。

$ nm segfault3
ldd
使用 ldd 命令查看二进制程序的共享链接库依赖,包括库的名称、起始地址,这样可以确定段错误到底是发生在了自己的程序中还是依赖的共享库中。

$ ldd ./segfault3

标签:为什么,segmentation,错误,segfault3,访问,memory,内存地址,出现
From: https://www.cnblogs.com/helloopenGauss/p/18093940

相关文章

  • 当使用git出现提示untracked files时怎么办?
    当使用git出现提示untrackedfiles时怎么办?背景介绍:在使用git工具时,遇到如下错误。报错内容:$gitstatusOnbranchmasterNocommitsyetUntrackedfiles:(use"gitadd..."toincludeinwhatwillbecommitted)docs/nothingaddedtocommitbutuntrac......
  • 【技术贴】Windows 11桌面出现“了解此图片”图标?一招教你轻松解决!
        亲爱的朋友们,大家好!近期,随着Windows11的更新与普及,一些用户反映他们的电脑桌面上意外出现了一个名为“了解此图片”的图标,并且桌面背景还会不请自来地自动更换,让人感到既困惑又无奈。    如果你也遇到了同样的问题,而且正在寻找一种简单快捷的方法来摆脱......
  • 传统FTP存在哪些问题?为什么一定要进行FTP替代?
    FTP在文件传输领域,可算是一位老大哥了!早出现于1970年代,那个时候,它是解决文件传输问题的最佳方案了,但是对着网络的发展,以及企业的需求变化,传统的FTP的问题就逐渐凸显出来了,所以很多企业开始寻找FTP替代的产品。我们先来看看传统FTP有哪些优势,可以风靡怎么多年:1、简单易用:FTP是......
  • 2024-3-24刷题的一个小错误,居然这么基础-_-!!
    力扣刷题刷到简单二分查找时,一运行代码就提示超时,怎么就超时了?反反复复几次,发现(right-left)>>1+left这一步需要在移位运算部分加括号,查了一下,基础中的基础是:移位运算优先级低于“+-*/”我要裂开了……真的好基础!!! intsearchInsert(int*nums,intnumsSize,inttarget){......
  • Java语言程序设计实验题目:编写Java程序统计一篇英文文档中各单词出现的次数,并按单词出
    题目描述编写Java程序统计一篇英文文档中各单词出现的次数,并按单词出现的频率由高到低进行输出。例如:文档“HellowordHello”的统计结果为: Hello:2次 word:1次思路分析1.处理文档:先用nextLine()将文段输入,存储在字符串file,再调用split()方法将字符串分割成一个......
  • 嵌入式硬件出现cpu占用过高的问题,如何解决cpu占用率过高
       当遇到嵌入式硬件中CPU占用率异常高的情况,通常首先要检查代码中是否存在死循环。死循环可能出现在for循环或while循环中,这会导致程序不断地执行,消耗大量CPU资源而不进行其他有用的工作。另外,在多线程应用中,如果线程中的while循环未包含适当的睡眠机制(例如调用sleep函数......
  • Spark重温笔记(三):Spark在企业中为什么能这么强?——持久化、Checkpoint机制、共享变量与
    Spark学习笔记前言:今天是温习Spark的第3天啦!主要梳理了Spark核心数据结构:RDD(弹性分布式数据集),包括RDD持久化,checkpoint机制,spark两种共享变量以及spark内核调度原理,希望对大家有帮助!Tips:"分享是快乐的源泉......
  • 关于Macbook错误方式删除登录用户,无法清除废纸篓
    近期我在删除mac上用户列表的某个用户时,发现在账户与群组中删除后,在访达的用户目录还存在那个用户的文件夹,遂将其拖进废纸楼然后惊奇的发现,这个文件夹无法清除,说正在使用Library之类的报错,由于没有什么办法,遂不管他但是麻烦来了,在这之后的每一次倾倒废纸篓,我都会遇到这个问题......
  • 《艾尔登法环》为什么又叫老头环,苹果电脑可以玩《艾尔登法环》吗
     《艾尔登法环》是一款黑暗幻想风开放世界角色扮演动作游戏。该游戏于2022年2月在Steam、PlayStation4、PlayStation5、XboxOne、XboxSeriesX/S上发售,受到了广大玩家和媒体的热烈欢迎和高度评价。然而,有些人可能不知道,这款游戏在国内还有一个别名,就是“老头环”。那么,......
  • Ubuntu下执行可执行二进制文件报文件找不到的错误:No such file or directory
      这个问题之前有碰到,但是没有在意去解决,最近使用Docker部署的时候又出现这个问题,找了一下资料,有了一个解决办法。  比如我们有二进制文件,正常来说它应该是这个样子的,可以执行并输出:    但是现在它报错,找不到文件了:    那么我们一步步来解决  第一步:查看文件......