【问题标题】:GDB complaining about missing raise.cGDB 抱怨缺少 raise.c
【发布时间】:2018-06-25 00:31:41
【问题描述】:

每次 gdb 捕获异常时,我都会遇到一个烦人的错误。 我已经运行了以下示例程序

#include <stdexcept>

int main() {
  throw std::invalid_argument("");
  return 0;
}

而运行gdb的结果是

terminate called after throwing an instance of 'std::invalid_argument'
  what():  

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.

这并不是那么糟糕,因为我确实得到了我需要的信息,只是让我烦恼......

有人知道如何解决这个问题吗?

【问题讨论】:

  • 为您的发行版使用包管理器并搜索该文件?
  • 我做到了。它在 gnulib 包中,但在安装后位于 /usr/share/gnulib/lib/raise.c 中。 Gdb 没有找到它。
  • 这里没有什么可修复的。即使您获取raise.c 并且能够看到该行发生了什么,这也只是浪费时间,因为它不是您的代码的一部分,实际上导致异常被抛出。
  • 我会走另一条路。你不在乎。你不需要raise的源代码。一旦 raise() 被调用,你就知道断言失败或抛出了异常。打印调用堆栈 (bt) 并移动到适当的框架 (frame n) 以调试您的代码。
  • '它只是在打扰我'不不不......它正在调试你;)

标签: c++ exception gdb


【解决方案1】:

要在 Ubuntu 上对 C 库进行完整的源代码调试,只需几个步骤:

  1. 安装调试信息版本的libc6。

    它可能已经安装了 - Ubuntu 上的 gdb 包对它有依赖 - 但如果不是,请运行 sudo apt install libc6-dbg

  2. 准备包系统以下载和处理源代码包,如果以前没有这样做的话。

    sudo apt install dpkg-dev
    grep deb-src /etc/apt/sources.list
    

    Grep 的输出应该会显示(可能还有其他我们不需要担心的匹配项):

    deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted
    deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
    

    如果 grep 显示这些 deb-src 行被 # 注释掉:

    # deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted
    # deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted
    

    然后编辑/etc/apt/sources.list以删除这些行开头的#,然后运行sudo apt update

  3. 下载对应C库安装版本的源码。

    首先,在任何地方创建一个目录 - 我将在这里使用/opt/src

    然后执行以下操作:

    cd /opt/src
    apt source libc6
    

    如果apt 命令给出类似的错误消息

    E: 你必须在你的sources.list中加入一些'source' URIs

    那么我在第 2 步中的说明可能已经过时了;在这里发表评论。

    下载完成后,运行:

    find $PWD -maxdepth 1 -type d -name 'glibc*'
    

    记住这个名字 - 类似于/opt/src/glibc-2.23

  4. 确定 gdb 期望在哪里找到源代码并进行适当的调整。

    运行 gdb,让它运行你的程序直到它停止,然后在 gdb 提示符下执行以下操作:

    (gdb) info source
    Current source file is ../sysdeps/unix/sysv/linux/raise.c
    Compilation directory is /build/glibc-KM3i_a/glibc-2.23/signal
    

    所以 gdb 期望源代码位于 /build/glibc-KM3i_a/glibc-2.23 中。有两种方法可以解决此问题:

    • 移动(或使用符号链接)以使源代码位于(或看起来位于)/build/glibc-KM3i_a/glibc-2.23 中。

      要么

    • 告诉 gdb 如何替换正确的源目录路径名:

      (gdb) set substitute-path /build/glibc-KM3i_a/glibc-2.23 /opt/src/glibc-2.23
      

    现在,回到你的框架,gdb 应该会显示源代码行:

    (gdb) frame 1
    #1 0xb7e2fea9 in __GI_raise (sig=6) at ../sysdeps/unix/sysv/linux/raise.c:54
             return INLINE_SYSCALL (tgkill, 3, pid, selftid, sig);
    

【讨论】:

  • 非常感谢。再过两周我就不会再回到电脑前了,但我期待着看看这是否可行。 :)
  • 第 3 步出现错误:E: You must put some 'deb-src' URIs in your sources.list
  • @migs647 我会调查的。您使用的是哪个版本的 Ubuntu?
  • @MarkPlotnick 20.04 :)
  • @migs647 第 2 步应该在 20.04 上运行;这些行将有focal 而不是bionic。如果你做grep ^deb-src /etc/apt/sources.list,有输出吗?
猜你喜欢
  • 2017-04-09
  • 2015-10-31
  • 1970-01-01
  • 2021-11-30
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多