Ravenscarサブセットを使用してAdaプログラムを作成しています(実行時に実行中のタスクの数がわかります)。コードは-fstack-check
スイッチを有効にしてgccによってコンパイルされます。私のタスクがスタックを超えた場合、プログラムは実行時にSTORAGE_ERRORを発生させるはずです。Ravenscarプログラムのスタック使用量を判断するためのベストプラクティス
pragma Storage_Size (Some_Value);
今私はSome_Value
を決定しなければならないものオプション思っていた:
エイダは、それら(タスク固有)はそうのような各タスクの指定時にスタックの上限を設定することを可能にします。これまでに聞いたことがあります:
- STORAGE_ERRORがもう発生しなくなるまで、野生の推測を行います。これは、OPが示唆しているものと多かれ少なかれhereです。
-fstack-usage
の出力をそこに送ります。- hereのようにいくつかのgnat固有の拡張を使用します(これは技術的に項目#2とどのように違いますか?)。
- gnatstackのようなスタックアナライザを取得し、それをあなたに任せましょう。
私はこれを正しく理解していれば、上記のすべての技術は、(すなわち、彼らが動作するために実行するプログラムを必要とする)ダイナミックです。静的アプローチも考えられますか?例えば。 Adaの高度な整合性オプション(例えば、No_Recursionなど)のいくつかをさらに制限することによって、他に何か?
おそらく、この問題に対処したり、私の(確かに不完全な)リストを拡張/コメントするためのベストプラクティスを挙げることができます。
ボーナス質問:上記のプラグマが指定されていない場合のタスクスタックのデフォルトサイズはいくらですか? GCCのdocsは、具体的な数値を指定せずにこの値が実行時によって異なります。
良い背景調査で良い質問! –
デフォルトのスタックサイズは 'System.Parameters.Default_Stack_Size'(ファイル' s-parame.adb')で与えられます。 –
@Simon:そのスタックサイズは環境タスク、宣言されたタスク、またはすべてのタスクに関係しますか?環境タスクに影響を与えない「スタックサイズの設定」オプションが出てきました。特定のコンパイラリリースでは明らかに設定できませんでした。これもulimit設定に反しています。私はプログラム全体を新しいタスクに動かすことでその周りに取り組みました... –