在此上下文中,堆栈是在程序运行时放置数据的最后进先出缓冲区。 最后一次出来(LIFO)意味着你输入的最后一件事总是你要退回的第一件事 - 如果你在堆叠上推2个项目,'A'然后'B',那么你首先要弹出的东西 在堆栈中将是'B',接下来是'A'。

当您在代码中调用函数时,函数调用之后的下一条指令将存储在堆栈中,以及可能被函数调用覆盖的任何存储空间。 您调用的函数可能会为其自己的局部变量使用更多堆栈。 完成后,它释放它使用的局部变量堆栈空间,然后返回到上一个函数。

堆栈溢出

堆栈溢出是指您为堆栈耗尽的内存超出了程序应该使用的内存。 在嵌入式系统中,堆栈可能只有256个字节,如果每个函数占用32个字节,那么你只能有函数调用8深 - 函数1调用函数2调用函数3调用函数4 .... 函数8调用函数9,但函数9覆盖堆栈外的内存。 这可能会覆盖内存,代码等。

许多程序员通过调用函数A然后调用函数B来犯这个错误,然后调用函数C然后调用函数A.它可能在大多数情况下工作,但只是一次错误的输入将导致它永远进入该循环 直到计算机识别出堆栈被夸大了。

递归函数也是导致这种情况的原因,但是如果你正在递归编写(即,你的函数自己调用),那么你需要注意这一点并使用静态/全局变量来防止无限递归。

通常,您正在使用的操作系统和编程语言管理堆栈,而且它不在您的手中。 您应该查看您的调用图(从您的主要显示每个函数调用的树结构),以查看函数调用的深度,以及检测非预期的循环和递归。 如果他们互相称呼过多次,则需要人为地检查故意循环和递归以防错误。

除了良好的编程实践,静态和动态测试之外,您无法在这些高级系统上做太多事情。

嵌入式系统

在嵌入式领域,特别是在高可靠性代码(汽车,飞机,太空)中,您可以进行大量的代码审查和检查,但您还要执行以下操作:

禁止递归和循环 - 由策略和测试强制执行

保持代码和堆栈相隔很远(代码在flash中,堆栈在RAM中,而且twain不会满足)

将保护带放置在堆栈周围 - 空白的内存区域,您填充了一个幻数(通常是软件中断指令,但这里有很多选项),每秒数百或数千次看保护带以确保 他们没有被覆盖。

使用内存保护(即,堆栈上没有执行,堆栈外没有读取或写入)

中断不会调用辅助函数 - 它们设置标志,复制数据,并让应用程序负责处理它(否则你可能会在函数调用树中深入8,有一个中断,然后在内部运行另外几个函数) 中断,引起井喷)。 你有几个调用树 - 一个用于主进程,一个用于每个中断。 如果你的中断可以互相打断......好吧,有龙......

高级语言和系统

但是在操作系统上运行的高级语言:

减少局部变量存储(局部变量存储在堆栈中 - 尽管编译器非常聪明,如果调用树很浅,有时会将大型本地变量放在堆上)

避免或严格限制递归

不要将程序分解成越来越小的函数 - 即使不计算局部变量,每个函数调用在堆栈上消耗多达64个字节(32位处理器,节省一半CPU寄存器,标志等)

保持呼叫树浅(类似于上面的陈述)

Web服务器

它取决于您拥有的“沙盒”,无论您是否可以控制甚至看到堆栈。 很有可能你可以像对待任何其他高级语言和操作系统一样对待Web服务器 - 它很大程度上取决于你的手,但检查你正在使用的语言和服务器堆栈。 例如,可以在SQL服务器上清空堆栈。

-亚当

python 堆栈溢出_内存 - 如何发生“堆栈溢出”,如何防止它?相关推荐

  1. vs显示堆栈数据分析_什么是“数据分析堆栈”?

    vs显示堆栈数据分析 A poor craftsman blames his tools. But if all you have is a hammer, everything looks like ...

  2. 堆栈跟踪 堆栈跟踪_寻找缺少的堆栈跟踪

    堆栈跟踪 堆栈跟踪 我们最近在博客中发表的一篇评论带回了有关特定体验的一些回忆. 我希望我没有经历过的那种经历. 在创建Plumbr之前很长一段时间,我正在调试一个应用程序,该应用程序每次在蓝月亮时都 ...

  3. Java 内存 关系_内存一致性 – 发生在Java之前的关系

    参见英文答案 > How to understand happens-before consistent                                    4个 在阅读有关内 ...

  4. java 异常堆栈输出_打印Java异常堆栈信息

    背景 在开发Java应用程序的时候,遇到程序抛异常,我们通常会把抛异常时的运行时环境保存下来(写到日志文件或者在控制台中打印出来).这样方便后续定位问题. 需要记录的运行时环境包含两部分内容:抛异常时 ...

  5. java bufferedimage 内存溢出_内存溢出使用ImageIO.write

    我让我的saveScreenShot线程内存溢出错误,即使是BlockingQueue的空内存溢出使用ImageIO.write在我的主要 存在时,下列变量存储图像 public static Blo ...

  6. c++算术溢出_二进制安全之堆溢出(系列)——CTF环境配置

    [重要通知]知了堂禁卫实验室全新上线!! 这里有安全体系的学习资源. 最前沿的原创文章.最新的漏洞挖掘原创!! 本期是"二进制安全之堆溢出"系列第一期,主要介绍CTF环境配置.安装 ...

  7. 导致溢出_邯郸一司机,溢出的“5毫克”导致A2被降级,老司机自吞“苦酒”

    酒后驾车宛如 "定时炸弹" 但就是有人偏要以身试法 下面这位司机 就为自己的行为付出了代价 案情回顾 1月6日晚上8时许,当民警巡查至大名府路与贵乡街路段处时,发现自东向西驶来的一 ...

  8. JAVA的内存溢出和内存泄漏

    目录 一.前言和定义 二.内存溢出和内存泄漏 JAVA堆溢出 JVM虚拟机栈和本地方法栈 方法区 三.如何尽可能的避免内存溢出和内存泄漏 一.前言和定义 在先前的博客中已经分析了JAVA对象内存分配, ...

  9. python共享内存mmap_python - IPC在单独的Docker容器中的Python脚本之间共享内存 - 堆栈内存溢出...

    问题 我已经编写了一个神经网络分类器,该分类器可以获取海量图像(每张图像约1-3 GB),将其打补丁,然后分别通过网络传递这些补丁. 培训的进行过程非常缓慢,因此我对其进行了基准测试,发现用大约50秒 ...

最新文章

  1. Virtual 2004中安装DOS以及实现文件共享的方法
  2. 深度学习——你应该掌握的数学知识
  3. canvas粒子动画
  4. .NET Core 和 .NET Framework 启动可执行文件的差别
  5. java 正则 栈溢出_关于Java正则引起的StackOverFlowError问题以及解决方案 | 学步园...
  6. 科研必备学士搜索引擎推荐
  7. Vue全家桶仿网易优选商城APP源码
  8. 魅族加入华为鸿蒙系统,华为鸿蒙正式开放系统 魅族表态加入却非手机 很是耐人寻味...
  9. 扫目录过狗过waf方法
  10. 使用Redis作为分布式锁的错误用法
  11. redis 用户订单缓存_Redis实战(12)-基于Key失效和定时任务实现订单支付超时自动失效...
  12. sqlserver 缩小表空间
  13. Mac 10.12使用free命令(fish)
  14. 【OpenCV入门指南】第七篇 线段检测与圆检测
  15. 【Linux学习】vim编辑器的使用
  16. HTML问答页面模板,问答社区简单静态页面模板
  17. 深入浅出H桥驱动电路
  18. 计算机考研各省份学校,想考研究生,哪个省份的高校更容易考上?
  19. 机载激光雷达原理与应用科普(四)
  20. Zotero+坚果云的文献二三事

热门文章

  1. 护士计算机怎么报名,护士自考本科怎样报名
  2. nginx curl linux,linux nginx 下通过curl url方式,符以后的参数无效
  3. gulp不生成打包文件_命令行输入gulp 无法生成压缩文件
  4. 与孩子一起学编程python_《与孩子一起学编程》python自测题
  5. 7.3联盟最多的服务器,1.7.3 超级服务器inetd和xinetd
  6. IntelliJ IDEA 2018.2.2远程调试Tomcat的配置方法
  7. 使用Q查询设计搜索框
  8. java中的容器问题
  9. haproxy 配置
  10. HDU 2577 How to Type