由于多种原因,我无法深入了解具体细节,但这是我正在使用的基本架构

  • 我有一个C++框架,该框架使用我构建的C++对象文件执行动态仿真。
  • 除其他外,C++库调用以Ada编写的共享(.so)库。

  • 尽我所知,Ada库(大量的重要代码)在附带情况下生成异常,但是我在隔离生成异常的函数时遇到了麻烦。

    这是我正在使用的:
  • CentOS 4.8(最终版)
  • gcc 3.4.6(w / gnat)
  • 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
    

    那时,它已经进入框架代码。

    我已经在线阅读了一些指南,教程和手册页,但是我有点茫然。我希望这里有人可以帮助我指出正确的方向。

    最佳答案

    听起来您能够编译Ada源代码。假设是这种情况,在通过其执行引发异常的被调用子程序中,在末尾添加一个转储异常信息的异常处理程序:

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

    您还需要在包中添加Ada.Exceptions的“with”。还有Ada.Text_IO(如果尚未存在)。

    我不确定您将从该版本的GNAT中得到什么,但是可能是调用地址,然后可以使用addr2line对其进行解码。

    关于c++ - 努力使用gdb调试带有Ada库的C++代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14991358/

    10-10 18:22
    查看更多