2013-02-20 114 views
1

我不能進入細節,對於各種各樣的原因,但這裏的就是我與使用GDB調試C++代碼W /阿達庫

  • 工作,我有必要架構掙扎一個C++框架,它使用由我構建的C++對象文件來執行動態仿真。
  • C++庫調用其中包含用Ada編寫的共享庫(.so)庫。

盡我所知,Ada庫(這是一個大集合的非平凡代碼)在邊緣情況下會產生異常,但我在隔離產生異常的函數時遇到了問題。

下面是我使用的是什麼:

  • 的CentOS 4.8(最終)
  • GCC 3.4.6(W /蚊蚋)
  • GDB 6.3.0.0-1.162.el4rh

這是我在正常執行情況下得到的錯誤:

terminate called without an active exception 
raised PROGRAM_ERROR : unhandled signal 

I ca n一旦它返回到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 ([email protected]) at ExceptionBase.cpp:140 

在這一點上,它的到框架的代碼。

我已經在線閱讀了幾篇指南和教程以及手冊頁,但是我有點不知所措。我希望有人能幫助我指出正確的方向。

+0

你給gdb什麼命令來捕捉異常? – 2013-02-20 22:55:59

+0

我嘗試了'捕獲信號SIGABRT',但是它回答了'Catch of signal not yet implemented.',所以我使用'handle SIGABRT stop'來嘗試捕獲信號,但是得到與上面類似的結果。 我認爲真正的問題,我不知道如何解決這個問題,是我不能打破Ada中未捕獲的異常。當我嘗試'catch exception'(基於某些我在網上找到的Ada特定gdb的東西)時,我得到一個錯誤,'爲catch指定的未知事件類型'。 – brightwellcd 2013-02-20 22:59:24

+1

我相信你的GDB需要用Ada支持專門構建。我注意到在我自己的工作中,'catch exception'只適用於專門面向Ada的GDB安裝,例如由AdaCore分發的安裝。 – 2013-02-20 23:01:36

回答

5

這聽起來像你能夠編譯的Ada源代碼。

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

您還需要:假設是這樣的話,在被稱爲通過其執行的例外被提出子程序(S),在轉儲異常信息的末尾添加一個異常處理程序將Ada.Exceptions的'with'添加到包中。而Ada.Text_IO如果還不存在的話。

我不確定你會從那個版本的GNAT中得到什麼,但它可能是你可以使用addr2line解碼的調用地址。

+0

這正是我所需要的。我必須在此之上添加一個「異常」行(以適應'begin','exception','end'過程結構),但是這讓我能夠在異常傳遞給C++代碼之前捕獲異常並獲得足夠的信息按照它的來源。 我還沒有解決問題,但我有我的第一個麪包屑。謝謝! – brightwellcd 2013-02-21 17:43:36

1

您可以從Ada main啓動C++框架嗎?如果是這樣,並且可以通過C++框架將異常傳播到Ada main,那麼它的最後一個機會處理程序應該給你一個非常好的報告,除了它發生的異常,源文件和行,以及addr2line的堆棧轉儲。我的經驗是,調試器通常在此之後不再需要。

,因爲我沒有使用過蚊蚋附近的任何地方一樣古老你我可能是大錯特錯這裏...

+0

我還沒有嘗試從Ada main開始框架,但我不確定如何做到這一點。我正在研究團隊中沒有人完全理解的代碼基礎。它不會幫助我的阿達福比較弱。你是否有一個從Ada main內部啓動框架的好例子?例如, – brightwellcd 2013-02-20 23:00:22

+0

,遵循這種方法 - http://wiki.ada-dk.org/c_bindings_example(注意:-fdump-ada-spec綁定生成器需要gcc4.6或更高版本,但是如果您可以發現C++命名機制,可以手動創建綁定)你可能只需要調用一個C++函數。另外:我不知道C++是否會阻止並完好地傳遞異常。 – 2013-02-20 23:07:02

+0

我不知道該框架是否會讓我用函數調用它,但我會在明天深入研究文檔,看看我能做些什麼。 – brightwellcd 2013-02-20 23:09:38