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