关于linux:堆栈上的segfault溢出

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适用于动态内存分配错误,但不适用于堆栈错误。 |
相关内容
正式发布的小米9支持5G信号吗对此你怎么看
正式发布的小米9支持5G信号吗对此你怎么看,小米,怎么看,正式发...
先科电脑显示器无信号|先科显示器使用方法
先科电脑显示器无信号|先科显示器使用方法,,1. 先科显示器使用...
电脑换了主板显示屏没信号|显示屏连显卡主板都
电脑换了主板显示屏没信号|显示屏连显卡主板都是无信号,,1. 显...
手机连接电脑调试网页|手机连接电脑调试网页怎
手机连接电脑调试网页|手机连接电脑调试网页怎么弄,,手机连接...
电脑屏幕总显示无信号|电脑屏幕总是显示无信号
电脑屏幕总显示无信号|电脑屏幕总是显示无信号,,电脑屏幕总是...
电脑显示器无信号输入|电脑显示器无信号输入怎
电脑显示器无信号输入|电脑显示器无信号输入怎么回事,,电脑显...
电脑显示器有电无信号|电脑显示器有电无信号怎
电脑显示器有电无信号|电脑显示器有电无信号怎么回事,,1. 电脑...
计算机主板故障调试代码
计算机主板故障调试代码,,核心提示:故障代码含义查找表的调试代...
有wifi信号电脑却不能上网|有wifi信号电脑却不
有wifi信号电脑却不能上网|有wifi信号电脑却不能上网咋回事,,...
户外手机信号增强器|手机上网信号增强器
户外手机信号增强器|手机上网信号增强器,,户外手机信号增强器...
ps4能否连接电脑|ps4连接电脑显示器无信号
ps4能否连接电脑|ps4连接电脑显示器无信号,,ps4连接电脑显示器...
电脑两网卡如何设置wifi信号|电脑无线网卡设置
电脑两网卡如何设置wifi信号|电脑无线网卡设置方法,,1. 电脑无...
电脑调试模式是什么|电脑如何打开调试模式
电脑调试模式是什么|电脑如何打开调试模式,,1. 电脑如何打开调...
电脑显示器待机没信号|电脑显示器待机没信号怎
电脑显示器待机没信号|电脑显示器待机没信号怎么解决,,1. 电脑...
台式电脑主机关不了机|台式电脑主机关不了机显
台式电脑主机关不了机|台式电脑主机关不了机显示屏显示无信...