2014-09-11 78 views

回答

4

我沒有手頭上的安裝檢查,但文件說,包GNAT.Source_Info「規定的子程序,讓訪問在編譯時已知源代碼的信息,如當前文件名和行號。「並且adacore有spec for the package(通過Christoph)

+2

看到http://adacore.com/gap-static/GNAT_Book/html/rts/g-souinf__ads.htm的文檔 – Christoph 2014-09-11 13:30:50

+0

代碼來獲得'文件:行,procedure': '與GNAT.Source_Info;' 'Put_Line(GNAT.Source_Info.Source_Location&「,」&NAT.Source_Info.Enclosing_Entity);' – StackUnderflow 2014-09-11 14:38:55

+0

在答案中修復了Christoph的鏈接:https://www2.adacore.com/gap-static/GNAT_Book/html/rts /g-souinf__ads.htm – 2018-01-26 18:42:47

1

對不起,__LINE____FILE__和其他__THING__是C預處理器的功能,這是ada沒有的東西。你可以陪陪一個簡單的Perl腳本(或類似的)來預先運行你的代碼,以模擬__LINE____FILE__,但是__func__會更困難,因爲這意味着實際上解析代碼。

啊,原來它存在於GNAT中。例如:

with Ada.Text_IO 
GNAT.Source_Info; 
use Ada.Text_IO 
GNAT.Source_Info; 

procedure source_error is 
    -- example of GNAT.Source_Info.Source_Location 
    i : integer; 
    j : integer := 0; 
begin 
    i := 5/j; -- division by zero 
exception when others => 
    put_line(standard_error 
Source_Location & ": exception raised"); 
end source_error; 
0

另一種方法是在異常情況下打印堆棧跟蹤。有一些GNAT綁定器參數用於啓用堆棧跟蹤存儲(-E?),然後您可以使用Ada.Exceptions包打印它們。還有一個包可以在任何時候或者發生異常情況下打印堆棧(我總是對所有任務都有最後一個處理程序處理程序)。請參閱http://rosettacode.org/wiki/Stack_traces#Ada

根據我的經驗,異常堆棧跟蹤非常適合查明問題。