首页 / 知识
关于linux:堆栈上的segfault溢出
2023-04-16 11:12:00

Segfault on stack overflow为什么Linux内核在堆栈溢出时生成segfault?当c或alltran中的临时数组创建溢出时,这会使调试变得很尴尬。当然,运行时肯定有可能产生更有用的错误。 您实际上可以使用信号处理程序来捕获堆栈溢出的条件。 为此,您必须做两件事:
然后,当您使堆栈溢出时,内核将在传递信号之前切换到备用堆栈。进入信号处理程序后,您可以检查导致错误的地址,并确定是堆栈溢出还是常规错误。 "内核"(实际上不是运行代码的内核,是CPU)不知道您的代码是如何引用不应接触的内存的。它只知道您尝试这样做。 代码:
当您尝试访问x的边界之外时, 不能真正被CPU评估。 您可能会使用以下相同的地址:
顺便说一句,我不鼓励使用alloca,因为堆栈比堆更受限制(请使用malloc代替)。 堆栈溢出是分段错误。就像您打破了最初分配给您的给定内存范围一样。有限大小的堆栈,您已经超过了它。您可以在Wikipedia 上阅读有关此内容的更多信息。 此外,我过去对项目所做的一件事是将自己的信号处理程序编写到segfault(请参见手册页信号(2))。我通常会捕获信号,然后在控制台上写出"发生致命错误"。我做了其他一些检查点标记和调试的工作。 为了调试段错误,您可以在GDB中运行一个程序。例如,以下C程序将出现段错误:
如果我这样编译它:
,然后像这样运行它:
我从GDB中发现,第8行存在分段错误。当然,有更复杂的方法来处理堆栈溢出和其他内存错误,但这足够了。 只需使用Valgrind。它会以极高的精确度指出您所有的内存分配错误。 一些注释是有帮助的,但是问题不在于内存分配错误。那是没有错误的代码。在fortran中,运行时会在堆栈上分配临时值,这很麻烦。因此,例如 对于其他发现此问题的人,有一个编译器标志,该标志将临时变量放在堆上一定大小以上。 堆栈溢出不一定会导致崩溃。它可能会悄无声息地破坏程序的数据,但会继续执行。 我不会使用SIGSEGV处理程序错误,而是要解决原始问题。 如果需要自动帮助,可以使用gcc的-Wstack-protector选项,该选项将在运行时发现一些溢出并中止程序。 valgrind适用于动态内存分配错误,但不适用于堆栈错误。 |
最新内容
相关内容
linux下进程调试命令?
linux下进程调试命令?,系统,工作,软件,信息,命令,基础,地址,状态,进程,实时,Linuxquid安装调试中几个常用命令介绍1、使用mkdir 命令创建一个linux查看信号值命令?
linux查看信号值命令?,时间,手机,检测,信息,工作,系统,软件,市场,命令,标准,Linux常用命令总结cat命令 cat(连接的缩写)是Linux中最常用的命令之linux命令行调试代码?
linux命令行调试代码?,环境,代码,信息,平台,程序,编辑,版本,步骤,体系结构,处理器,linux怎么调试pythonLinux中如何安装Python?安装pycharmPychlinux下单步调试命令?
linux下单步调试命令?,信息,系统,代码,工程,地址,工具,工作,数据,管理,环境,linux系统中怎样单步调试c++工程1、一般工作在命令行模式;c程序的linux串口调试命令?
linux串口调试命令?,设备,数据,信息,数字,系统,标准,通讯,软件,通用,状态,linux中注册了串口设备ttyE0,但是对其cat和echo指令都卡住,无任何反linux查看信号表命令?
linux查看信号表命令?,网络,地址,信息,系统,电脑,命令,数字,通信,服务,信号,linux查找网络配置命令是什么?首先在电脑上打开Linux系统,然后进入linux保留堆栈命令?
linux保留堆栈命令?,地址,工作,系统,信息,管理,命令,目录,代码,名称,连续,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、calinux创建数组命令?
linux创建数组命令?,地址,工作,系统,信息,命令,代码,目录,情况,标准,文件,Linux命令linux系统常用操作命令如下:ls:全拼list,功能是列出目录的内linux调试终端命令?
linux调试终端命令?,系统,工作,地址,首页,电脑,终端,命令,标准,信息,基础,求Linux操作系统的一些终端命令,多谢。linux系统常用操作命令linuxlinux脚本调试的命令?
linux脚本调试的命令?,工作,系统,管理,命令,地址,标准,脚本,底部,代码,官网,linux下shell脚本命令shell变量调出命令。linux中的shell脚本有多linux命令调试模式?
linux命令调试模式?,系统,工作,信息,地址,工程,命令,工具,环境,设备,地方,linux下如何使用gdb调试gdb test 进入调试需要调试的地方打下断点,rulinux调试驱动的命令?
linux调试驱动的命令?,系统,网络,官网,百度,地址,下来,第一,官方网站,软件,情况,linux下安装编译网卡驱动的方法1、网卡相关的TCP/IP网络配置