确定 Ravenscar 程序中堆栈使用情况的最佳实践

2024-02-29

我正在使用 Ravenscar 子集编写一个 Ada 程序(因此,我知道执行时正在运行的任务数量)。该代码是由 gcc 编译的-fstack-check https://gcc.gnu.org/onlinedocs/gnat_ugn/Stack-Overflow-Checking.html开关启用。这应该会导致程序引发存储错误 http://archive.adaic.com/standards/83lrm/html/lrm-11-01.html在运行时,如果我的任何任务超出了它们的堆栈。

Ada 允许在指定相应任务期间设置这些(特定于任务的)堆栈的上限,如下所示:

pragma Storage_Size (Some_Value);

现在我想知道我必须确定哪些选项Some_Value。到目前为止我所听到的:

  1. 进行疯狂的猜测,直到不再出现 STORAGE_ERROR 为止。这或多或少是OP建议的here https://stackoverflow.com/questions/389219/how-to-determine-maximum-stack-usage.
  2. 馈送输出-fstack-usage https://gcc.gnu.org/onlinedocs/gnat_ugn/Static-Stack-Usage-Analysis.html在那里。
  3. 按照概述使用一些特定于 gnat 的扩展here http://www.adacore.com/adaanswers/gems/gem-93-gnat-dynamic-stack-analysis/(这在技术上与第 2 项有何不同?)。
  4. 获取一个堆栈分析器,例如蚊子堆 http://www.adacore.com/gnatstack并让它为您工作。

如果我理解正确的话,以上所有技术都是dynamic(即他们需要程序运行才能工作)。静态方法也可以想象吗?例如。通过艾达的一些高度诚信的选项(例如无递归 http://www.adaic.org/resources/add_content/standards/12rm/html/RM-H-4.html, 还有什么?)。

也许你们中的任何人都可以说出一些解决此问题的最佳实践和/或对我的(肯定不完整)列表进行扩展/评论。

附加问题:当未指定上述编译指示时,任务堆栈的默认大小是多少?海湾合作委员会的docs https://gcc.gnu.org/onlinedocs/gnat_ugn/Stack-Overflow-Checking.html仅说明该值取决于运行时间,而没有给出任何具体数字。


您通常可以使用以下命令检查各个类型所需的堆栈空间'Storage_Size属性(以位为单位)。

一旦您将其制成表格(您可能需要将其四舍五入为整个字/双字),您可以将每个声明区域使用的堆栈空间加起来,然后遍历您的调用以查找最大堆栈使用量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定 Ravenscar 程序中堆栈使用情况的最佳实践 的相关文章

随机推荐