Я не могу вдаваться в подробности по разным причинам, но вот основная архитектура того, с чем я работаю
Насколько я могу судить, библиотека Ada (которая представляет собой большую коллекцию нетривиального кода) генерирует исключения в некоторых случаях, но у меня возникают проблемы с выделением функции, которая генерирует исключение.
Вот что я использую:
Это ошибка, которую я получаю при обычном выполнении:
terminate called without an active exception
raised PROGRAM_ERROR : unhandled signal
Я могу заставить GDB перехватить исключение, как только оно вернется в C ++, но я не могу заставить его перехватить код 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
На данный момент, это в код фреймворка.
Я прочитал несколько руководств и учебных пособий и справочных страниц в Интернете, но я немного растерялся. Я надеюсь, что кто-то здесь может помочь мне указать правильное направление.
Похоже, вы можете скомпилировать исходный код Ada. Предполагая, что это так, в подпрограмму (ы), которые вызываются при выполнении которых вызываются исключения, добавьте обработчик исключения в конце, который выдает информацию об исключении:
when E : others =>
Ada.Text_IO.Put_Line(Ada.Exceptions.Exception_Information(E));
raise;
Вам также необходимо добавить «с» Ada.Exceptions в пакет. И Ada.Text_IO, если этого еще нет.
Я не уверен, что именно вы получите из этой версии GNAT, но это, вероятно, адреса вызовов, которые вы можете затем декодировать с помощью addr2line.
Не могли бы вы начать каркас C ++ с основной Ada? Если это так, и вы можете распространять исключения через платформу C ++ на главную страницу Ada, обработчик последнего шанса должен дать вам довольно хороший отчет с исключением, исходным файлом и строкой, где это произошло, и дампом стека для addr2line. Мой опыт показывает, что отладчик обычно не нужен после этого.
Я мог бы быть здесь вне поля зрения, потому что я не использовал комара где-то столь же старого, как ваш …