1
3
很难准确地预测您需要多少堆栈(如果您选择了正确的选项,一些工具链可能会尝试这样做,但这只是一个粗略的指南)。 检查堆栈状态的一种常见方法是在启动时用已知值将其完全填充,尽可能长/硬地运行代码,然后查看有多少未被覆盖。
不幸的是,虽然这些概念非常简单:用一个已知的值填充堆栈,计算剩余的值的数量,但是实现它的现实需要对特定工具(特别是启动代码和链接器)的工作方式有相当深入的了解。 检查堆栈溢出是否是导致问题的原因的简单方法是使所有本地数组“静态”和/或大幅增加堆栈的大小,然后查看是否工作得更好。在小型嵌入式系统上,这两者都很难做到。 |
2
1
我想你现在有一个类似(1)的内存映射。 当堆栈和/或变量空间增大到很大时,它们会相互碰撞并覆盖(*)。 当堆栈或变量空间超过最大空间时,它们命中未映射的ADDR空间(*)。 取决于控制器(我不确定AVR系列),这会导致重置/陷阱或类似的(=你想要的)。
(如果使用更多变量/堆栈,箭头指示增长方向) 当然,最好事先确保RAM足够大。 |
3
1
还要注意,如果处理的是多线程应用程序,那么每个线程都有自己的堆栈,这些堆栈经常在线程启动时从堆中分配。 除非处理器上有一些硬件检查堆栈溢出(不太可能),否则可以使用一些技巧来监视堆栈使用情况。
|
4
0
通常,您的编程工具知道控制器的参数,因此如果您使用更多(没有mallocs,它在编译时是已知的),则应该警告您。 但是你应该注意像素数据,因为大多数显示器没有线性地址空间。
|
pickle323 · C编程:现代方法-第10章项目6-困惑 6 年前 |
Gameatro · 为什么malloc在函数内部调用时返回空指针? 6 年前 |
E. Peracchia · F#函数调用工作不正常 6 年前 |
Jorge Zazueta · 汉诺塔C++的堆栈实现 6 年前 |
adamcasey · 缓冲区溢出“攻击”中的操作序列 6 年前 |