2014-09-11 2 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

+0

код, чтобы получить файл ': линия, procedure': ' с GNAT.Source_Info; ' 'Put_Line (GNAT.Source_Info.Source_Location &", "& NAT.Source_Info.Enclosing_Entity);' – StackUnderflow

+0

Исправлена ​​ссылка Кристофа в ответ: https://www2.adacore.com/gap-static/GNAT_Book/html/rts /g-souinf__ads.htm –

1

Извините, __LINE__ и __FILE__, а другие __THING__ s - это функции предварительного процессора C, который не является тем, что есть у ada. Вероятно, вы могли бы использовать жюри-простой прокси-скрипт (или аналогичный) для предварительного запуска кода для имитации __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

В моем опыте следы стека на исключении идеально подходят для выявления проблем.

Смежные вопросы