gpt4 book ai didi

c++ - 努力使用 gdb 调试带有 Ada 库的 C++ 代码

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:47 25 4
gpt4 key购买 nike

由于各种原因,我无法详细说明,但这是我正在使用的基本架构

  • 我有一个 C++ 框架,它使用我构建的 C++ 目标文件来执行动态模拟。
  • C++ 库调用了一个用 Ada 编写的共享 (.so) 库。

据我所知,Ada 库(它是大量重要代码的集合)在边缘情况下生成异常,但我无法隔离生成异常的函数。

这是我正在使用的:

  • CentOS 4.8(最终版)
  • gcc 3.4.6(带 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 [...] 行来自框架。当我 try catch 该中断,然后运行回溯 (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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com