1

さまざまな理由から詳細には触れられませんが、私が使用している基本的なアーキテクチャは次のとおりです。

  • 私が作成した C++ オブジェクト ファイルを使用してダイナミック シミュレーションを実行する C++ フレームワークがあります。
  • C++ ライブラリは、とりわけ、Ada で書かれた共有 (.so) ライブラリを呼び出します。

私が知る限り、Ada ライブラリ (自明ではないコードの大規模なコレクション) は例外的なケースで例外を生成していますが、例外を生成している関数を特定するのに問題があります。

これが私が使用しているものです:

  • CentOS 4.8 (最終版)
  • gcc 3.4.6 (ブヨ付き)
  • gdb 6.3.0.0-1.162.el4rh

これは、通常の実行で発生するエラーです。

terminate called without an active exception
raised PROGRAM_ERROR : unhandled signal

C++ に戻るとすぐに gdb に例外をキャッチさせることはできますが、Ada コード内で例外をキャッチさせることはできません。すべてを でコンパイルするようにしまし-gたが、問題は解決していないようです。

シグナル/例外をキャッチ/ブレークしようとするとgdb(丁寧に教えてくれますCatch of signal not yet implemented)、次のようになります:

[Thread debugging using libthread_db enabled]
[New thread -1208371520 (LWP 14568)]
terminate called without an active exception
Program received signal SIGABRT, Aborted.
[Switching to thread -1208371520 (LWP 14568)]
0x001327a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2

terminate called [...]線はフレームワークからのものだと思います。そのブレークをキャプチャしてからバックトレース ( ) を実行しようとすると、次のbtような結果が得られます。

#0  0x001327a2 in gdb makes me want to flip tables.
#1  0x00661825 in raise () from /lib/tls/libc.so.6
#2  0x00663289 in abort () from /lib/tls/libc.so.6
#3  0x0061123e in __gnu_cxx: __verbose_terminate_handler () from /usr/lib/libstdc++.so.6
#4  0x0060eed1 in __xac_call_unexpected () from /usr/lib/libstdc++.so.6
#5  0x0060ef06 in std::terminate () from /usr/lib/libstdc++.so.6
#6  0x0060f0a3 in __xax_rethrow () from /usr/lib/libstdc++.so.6
#7  0x001fe526 in cpputil::ExceptionBase::Rethrow (scope=@0xbfe67470) at ExceptionBase.cpp:140

その時点で、それはフレームワーク コードに入ります。

オンラインでいくつかのガイド、チュートリアル、およびマニュアル ページを読みましたが、少し腑に落ちません。ここの誰かが私を正しい方向に向けるのを手伝ってくれることを願っています.

4

2 に答える 2

6

Adaソースコードをコンパイルできるようです。その場合、実行によって例外が発生しているサブプログラムで、例外情報をダンプする例外ハンドラーを最後に追加します。

when E : others =>
    Ada.Text_IO.Put_Line(Ada.Exceptions.Exception_Information(E));
    raise;

また、パッケージにAda.Exceptionsの「with」を追加する必要があります。そして、それがまだ存在しない場合は、Ada.Text_IO。

そのバージョンのGNATから何が得られるかは正確にはわかりませんが、addr2lineを使用してデコードできる呼び出しアドレスである可能性があります。

于 2013-02-21T01:31:15.167 に答える
1

C++ フレームワークを Ada メインから開始できますか? その場合、C++ フレームワークを介して Ada メインに例外を伝播できます。そのラスト チャンス ハンドラは、例外、ソース ファイルと発生した行、および addr2line のスタック ダンプを含むかなり適切なレポートを提供するはずです。これらに関する私の経験では、その後デバッガーは通常必要ありません。

私はあなたと同じくらい古いブヨを使ったことがないので、ここではビームから外れている可能性があります...

于 2013-02-20T22:57:40.423 に答える