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

Gcc 确定Ravenscar程序中堆栈使用情况的最佳实践,gcc,memory,ada,Gcc,Memory,Ada,我正在使用Ravenscar子集编写一个Ada程序(因此,我知道执行时正在运行的任务的数量)。代码由gcc编译,开关处于启用状态。如果我的任何任务超出其堆栈,这将导致程序在运行时引发错误 Ada允许在指定相应任务期间为这些(特定于任务的)堆栈设置上限,如下所示: pragma Storage_Size (Some_Value); 现在我想知道我有什么选择来确定某个值。到目前为止,我听到的是: 进行疯狂猜测,直到不再出现存储错误。这或多或少就是OP的建议 在那里输入输出的数据 使用概述的一些特定

我正在使用Ravenscar子集编写一个Ada程序(因此,我知道执行时正在运行的任务的数量)。代码由gcc编译,开关处于启用状态。如果我的任何任务超出其堆栈,这将导致程序在运行时引发错误

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

pragma Storage_Size (Some_Value);
现在我想知道我有什么选择来确定某个值。到目前为止,我听到的是:

  • 进行疯狂猜测,直到不再出现存储错误。这或多或少就是OP的建议
  • 在那里输入输出的数据
  • 使用概述的一些特定于蚊虫的扩展(这在技术上与第2项有何不同?)
  • 找一个像这样的堆栈分析器,让它为您完成工作
  • 如果我理解正确,以上所有技术都是动态的(即,它们需要程序运行才能工作)。静态方法也是可以想象的吗?例如,通过Ada的一些高诚信选项(例如,还有什么?)进一步限制自己

    也许你们中的任何一个人都可以列举一些解决这个问题的最佳实践和/或扩展/评论我的(当然是不完整的)列表


    附加问题:当没有指定上述pragma时,任务堆栈的默认大小是多少?GCC的唯一状态此值取决于运行时,而不提供任何具体数字。

    您通常可以使用
    'Storage\u Size
    属性(以位计)检查各个类型所需的堆栈空间


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

    好问题,好背景研究!默认堆栈大小在
    System.Parameters.default_stack_size
    (文件
    s-parameter.adb
    )中给出。@Simon:该堆栈大小与环境任务、声明的任务或所有任务相关吗?我问这个问题是因为我遇到了一个“设置堆栈大小”选项,它不会影响环境任务——显然,在特定的编译器版本中,它是不可设置的,它也违反了ulimit设置。我通过将整个程序移动到一个新任务中来解决这个问题…@Brian:下面几行是
    默认的\u Env\u Stack\u Size
    (这里是8MB,5.2.0)。如果程序没有在任务运行时调用,是否存在环境任务?(注意,我所说的都是与桌面相关的;我不知道AdaCore的裸板RTS是如何工作的)。你建议手动操作吗?这听起来像是一项乏味的工作。。。可能有任何工具支持这一点吗?我只是建议您手动操作。除非限制自己不使用递归,否则我怀疑您是否可以通过静态分析来实现。如果不使用递归,应该可以编写一个基于ASIS的小工具来完成这项工作。