2

AdaCores GPS (Gnat Programming Studio) でコンパイルした後、アプリケーションを実行しようとしています。

実行時エラーが発生します

Exception name: STORAGE_ERROR
Message: EXCEPTION_STACK_OVERFLOW

を使用してバインダー オプションでスタック サイズを設定しているにもかかわらず、これらの実行時エラーが発生します。

-d65535 (タスク スタック サイズ) および -D65535 (セカンダリ スタック サイズ) (両方で 65535k と 655m を試しました)。

アプリケーションは、Aonix Object Ada コンパイラでコンパイルするとうまく動作します。Aonix コンパイラで、スタック サイズを 65535、セカンダリ スタック サイズを 65535、タスク スタック サイズを 46345 に設定しました。

私の主な目的は、アプリケーションを GNAT Ada コンパイラに移植することです。

-d がタスク スタック サイズを設定し、-D がセカンダリ スタック サイズを設定していることに気付きましたが、メイン スタック サイズを設定する場所がわかりません。これはアプリケーションの問題であると想定していますが、問題がある場合は修正してください。間違った方向を見ています。

任意のポインタをいただければ幸いです。

ベアスランバー

4

2 に答える 2

1

最初に、デバッグ用にコンパイル (-g) (他にも関連するオプションがあるかもしれません。間違った情報を投稿するのが最も早い方法です;-)、より多くの情報を取得する必要があります: 例外が発生したソース行とファイル。または addr2line 経由で分析できるスタック トレース。

それはなぜそれが上昇しているのかを理解するのに役立つはずです...

  • スタックに数百 MB を割り当てていますか? 過去に約200MBで逃げました...
  • コンテナ クラスの 1 つまたは RTS の一部内でのレイズですか?
  • メッセージは実際に誤解を招き、new()ヒープの割り当てに失敗しましたか? スタック以外のものは Storage_Error を発生させる可能性があり、デフォルトのハンドラーが原因をどのように、または区別するかは明確ではありません...

さらに情報がなければ、このパスをさらに進めることはできません。質問に編集してください。もう一度見てみましょう。

Gnat内で環境タスクのスタック サイズを直接設定することはできません。これは gcc の OS との対話の一部でありulimit、結果の実行可能ファイルにシステムの設定を使用することになっています (Linux では、他の OS は異なる場合があります)...

残念ながら、gcc/gnat 4.5 の頃に、これらが無視されていたという証拠を見つけましたが、それは修正された可能性があり、私はその問題を再検討していません。

デバッグ トレースと ulimit の設定で答えが得られない場合、またはデバッグに時間を費やす代わりに続行する必要がある場合は、Alex の答えが実行可能な回避策として別の場所に投稿されているのを見てきました。コードベースをきれいに保つために、必要なタスクを作成して現在のメイン プロシージャを呼び出すだけのラッパーをお勧めします。Aonix の場合、ビルドにラッパー ファイルを含める必要はありません。

于 2015-08-25T10:08:55.523 に答える