【发布时间】:2021-07-27 13:34:27
【问题描述】:
我正在编写一个嵌入式程序,它使用一个已知大小的静态有限堆栈区域(换句话说,我有 X 个字节用于堆栈,并且没有可以按需为我分配更多堆栈的覆盖操作系统)。我想在运行时避免错误,而是在构建时捕获它们 - 如果我在运行时不适合堆栈的某些函数块中错误地声明了太多变量,则可以得到一些指示。
鉴于我在我的程序中不使用递归调用,我能否在编译期间以某种方式知道我的所有局部变量在最深的函数调用路径上将占用多少堆栈空间?或者至少知道如果编译器不够聪明,无法在所有嵌套调用中分析我的变量在单个块(函数)中占用多少空间?
【问题讨论】:
-
老派的方法是在从调试器重置时将整个堆栈区域设置为 0xAA 之类的值,然后让程序运行一段时间,确保激发所有用例。然后停止并检查内存中还有多远的 0xAA。这不是 100% 科学的、万无一失的方法,但在绝大多数情况下,在实践中都可以正常工作。
-
@Emoun 编译器如何跟踪中断?它是否以某种方式下载带有程序的动态分析器或什么?如果不是,那么该链接不是正确答案。似乎是一些幼稚的 PC 编程解决方案。虽然this answer 提出了与我在上面评论中所做的完全相同的方法。
-
@Lundin 在 OP 的问题中他没有提到需要跟踪中断,因此该链接回答了如何使用 GCC 获取堆栈使用的直接问题。它是一个嵌入式系统,所以我从 OP 的描述中假设他们的程序具有完全的控制权。但是,如果您需要考虑中断,您可以独立分析中断处理程序,只需添加数字即可。虽然还没有真正考虑过这一点,所以并不是说它会完美无缺。
-
@Emoun 设计完全没有中断的嵌入式系统是不可能的。我们希望尽可能避免它们,但至少可能仍然存在至少一个循环定时器中断和其他错误状态中断。
标签: c gcc stack embedded clang