Linux — борьба с использованием GDB для отладки кода C ++ с библиотекой Ada

Я не могу вдаваться в подробности по разным причинам, но вот основная архитектура того, с чем я работаю

  • У меня есть C ++ Framework, который использует объектные файлы C ++, созданные мной для выполнения динамического моделирования.
  • Библиотеки C ++, помимо прочего, называют разделяемой (.so) библиотекой, написанной на Ada.

Насколько я могу судить, библиотека Ada (которая представляет собой большую коллекцию нетривиального кода) генерирует исключения в некоторых случаях, но у меня возникают проблемы с выделением функции, которая генерирует исключение.

Вот что я использую:

  • CentOS 4.8 (Финал)
  • ГЦК 3,4,6 (вес / год)
  • GDB 6.3.0.0-1.162.el4rh

Это ошибка, которую я получаю при обычном выполнении:

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

На данный момент, это в код фреймворка.

Я прочитал несколько руководств и учебных пособий и справочных страниц в Интернете, но я немного растерялся. Я надеюсь, что кто-то здесь может помочь мне указать правильное направление.

1

Решение

Похоже, вы можете скомпилировать исходный код Ada. Предполагая, что это так, в подпрограмму (ы), которые вызываются при выполнении которых вызываются исключения, добавьте обработчик исключения в конце, который выдает информацию об исключении:

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

Вам также необходимо добавить «с» Ada.Exceptions в пакет. И Ada.Text_IO, если этого еще нет.

Я не уверен, что именно вы получите из этой версии GNAT, но это, вероятно, адреса вызовов, которые вы можете затем декодировать с помощью addr2line.

6

Другие решения

Не могли бы вы начать каркас C ++ с основной Ada? Если это так, и вы можете распространять исключения через платформу C ++ на главную страницу Ada, обработчик последнего шанса должен дать вам довольно хороший отчет с исключением, исходным файлом и строкой, где это произошло, и дампом стека для addr2line. Мой опыт показывает, что отладчик обычно не нужен после этого.

Я мог бы быть здесь вне поля зрения, потому что я не использовал комара где-то столь же старого, как ваш …

1