1

私は、Solaris から Red Hat にテスト アプリケーションを移植する仕事を提供されたインターンです。アプリケーションは Ada で書かれています。Unix側では問題なく動作します。Linux 側でコンパイルしましたが、現在、セグ フォールトが発生しています。デバッガーを実行して障害の場所を確認したところ、次のようになりました。

Warning: In non-Ada task, selecting an Ada task. => runtime tasking structures have not yet been initialized. <non-Ada task> with thread id 0b7fe46c0 process received signal "Segmentation fault" [11] task #1 stopped in _dl_allocate_tls at 0870b71b: mov edx, [edi] ;edx := [edi]

この seg fault は、呼び出しが行われる前、または何かが初期化される前に発生します。ada の「タスク」はプログラムの残りの部分よりも先に開始されると言われましたが、問題は実行中のタスクにある可能性があります。

しかし、ここにキッカーがあります。このプログラムは、別のプログラムが使用するコードを生成するだけです。OTHER プログラムを Linux でコンパイルすると、同じ種類のエラー メッセージとともに同じ種類のセグ フォールトが表示されます。これは、これをすべて修正するために使用できる小さな調整があるかもしれないと私に信じさせますが、Unix、Linux、および Ada について、これを自分ですべて理解するのに十分な知識がありません。

4

3 に答える 3

1

これは暗闇の中でのトータルショットですが、スタックにローカルメモリを割り当てすぎている場合は、起動時にこのようにタスクを爆破させることができます。メインプログラムはシステムスタックを安全に使用できますが、タスクは起動時に動的メモリからスタックを割り当てる必要があるため、通常、ランタイムにはタスクのデフォルトのスタックサイズがあります。タスクが大きな配列を割り当てようとすると、その制限を簡単に超えてしまう可能性があります。私は以前にそれが起こったことがあります。

これを修正する方法は複数あります。1つの方法は、すべてのタスクローカルデータをパッケージグローバルエリアに移動することです。もう1つは、すべてを動的に割り当てることです。

十分なメモリ量を把握できる場合は、さらにいくつかのオプションがあります。タスクをタスクタイプにしてから、

for My_Task_Type_Name'Storage_Size use Some_Huge_Number;

声明。「pragmaStorage_Size(My_Task_Type_Name)」を使用することもできますが、「for」ステートメントの方が適していると思います。

最後に、Gnatを使用すると、-dフラグを使用してデフォルトのタスクスタックサイズをgnatbindに変更することもできます。

于 2009-07-07T14:19:37.863 に答える
0

予感:リンクの手順がうまくいきませんでした。おそらく、間違ったランタイムスタートアップライブラリがリンクされましたか?

(質問が行われてから数か月後に、実際の問題が何であるかを知る可能性はどのくらいありますか?)

于 2009-12-29T05:42:03.443 に答える
0

コードが Sparc マシンで使用されていて、現在 x86 マシンで実行している場合、エンディアンの問題が発生する可能性があります。

あまり役に立ちませんが、マルチプラットフォームに移行する際によくある落とし穴です。

于 2009-06-29T17:32:29.337 に答える