【问题标题】:How to install libstdc++6 debug symbols on Ubuntu 20.04?如何在 Ubuntu 20.04 上安装 libstdc++6 调试符号?
【发布时间】:2021-03-01 18:13:15
【问题描述】:

例如,采取以下最小示例:

#include <cstdio>
#include <stdexcept>

int main(int argc, char* argv[]){
#ifdef __GLIBCPP__
    std::printf("GLIBCPP: %d\n",__GLIBCPP__);
#endif
#ifdef __GLIBCXX__
    std::printf("GLIBCXX: %d\n",__GLIBCXX__);
#endif
    throw std::runtime_error("Were are libstdc++.so.6 debug symbols?");
    return 0;
}

在我的gdb 中运行它时,它不显示libstdc++.so.6 的调试符号:

$ g++ -o testmain test.cpp -ggdb --std=c++98 && gdb ./testmain
GNU gdb (Ubuntu 9.1-0ubuntu1) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
...
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./testmain...
(gdb) r
Starting program: /home/user/Downloads/testmain 
GLIBCXX: 20200408
terminate called after throwing an instance of 'std::runtime_error'
  what():  Were are libstdc++.so.6 debug symbols?
Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt f
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
        set = {__val = {0, 0, 0, 0, 0, 0, 0, 0, 29295, 0, 0, 0, 0, 0, 0, 0}}
        pid = <optimized out>
        tid = <optimized out>
        ret = <optimized out>
#1  0x00007ffff7be1859 in __GI_abort () at abort.c:79
        save_stage = 1
        act = {__sigaction_handler = {sa_handler = ... <stderr>}
        sigs = {__val = {32, 0 <repeats 15 times>}}
#2  0x00007ffff7e67951 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#3  0x00007ffff7e7347c in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#4  0x00007ffff7e734e7 in std::terminate() () from /lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#5  0x00007ffff7e73799 in __cxa_throw () from /lib/x86_64-linux-gnu/libstdc++.so.6
No symbol table info available.
#6  0x000055555555524a in main (argc=1, argv=0x7fffffffdef8) at test.cpp:11
No locals.
(gdb) 

它只为libstdc++.so.6 帧显示No symbol table info available

如何显示libstdc++.so.6 的符号?

在此列表中搜索https://packages.ubuntu.com/search?keywords=libstdc%2B%2B6,我已经尝试安装以下软件包,但都没有解决问题:

  1. libgcc-10-dev:amd64 &lt;none&gt; 10.2.0-5ubuntu1~20.0
  2. libstdc++-10-dev:amd64 &lt;none&gt; 10.2.0-5ubuntu1~20.0
  3. libstdc++6-10-dbg:amd64 &lt;none&gt; 10.2.0-5ubuntu1~20.0
  4. libc6-amd64-cross:all &lt;none&gt; 2.31-0ubuntu7cross
  5. linux-libc-dev-amd64-cross:all &lt;none&gt; 5.4.0-21.25cross
  6. libc6-dev-amd64-cross:all &lt;none&gt; 2.31-0ubuntu7cross
  7. libstdc++6-amd64-cross:all &lt;none&gt; 10.2.0-5ubuntu1~20.04cross
  8. libgcc-10-dev-amd64-cross:all &lt;none&gt; 10.2.0-5ubuntu1~20.04cross
  9. libstdc++-10-dev-amd64-cross:all &lt;none&gt; 10.2.0-5ubuntu1~20.04cross
  10. libstdc++6-10-dbg-amd64-cross:all &lt;none&gt; 10.2.0-5ubuntu1~20.04cross
  11. libx32stdc++6-10-dbg:amd64 &lt;none&gt; 10.2.0-5ubuntu1~20.0

相关问题:

  1. How do you find what version of libstdc++ library is installed on your linux machine?
  2. /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"

更新 1

$ dpkg --list | grep libstdc++6
ii  libstdc++6:amd64                              10.2.0-5ubuntu1~20.04                 amd64        GNU Standard C++ Library v3
ii  libstdc++6-10-dbg-amd64-cross                 10.2.0-5ubuntu1~20.04cross1           all          GNU Standard C++ Library v3 (debug build) (amd64)
ii  libstdc++6-7-dbg:amd64                        7.5.0-6ubuntu2                        amd64        GNU Standard C++ Library v3 (debug build)
ii  libstdc++6-amd64-cross                        10.2.0-5ubuntu1~20.04cross1           all          GNU Standard C++ Library v3 (amd64)

更新 2

$ dpkg --list | grep libstdc++6
ii  libstdc++6:amd64                              10.2.0-5ubuntu1~20.04                 amd64        GNU Standard C++ Library v3
ii  libstdc++6-10-dbg:amd64                       10.2.0-5ubuntu1~20.04                 amd64        GNU Standard C++ Library v3 (debug build)
ii  libstdc++6-10-dbg-amd64-cross                 10.2.0-5ubuntu1~20.04cross1           all          GNU Standard C++ Library v3 (debug build) (amd64)
ii  libstdc++6-amd64-cross                        10.2.0-5ubuntu1~20.04cross1           all          GNU Standard C++ Library v3 (amd64)

【问题讨论】:

  • sudo apt-get install libstdc++6 或许可以解决问题
  • 检查什么包提供了你的 libstdc++6 并安装相应的“-dbg”包。对于 Ubuntu 20.04,它应该是 libstdc++6-7-dbg 或 libstdc++6-10-dbg
  • @Botje ,我如何检查哪个包提供了我的 libstdc++6 ?我已经安装了libstdc++6-7-dbglibstdc++6-10-dbglibstdc++6,但问题仍然存在。我用dpkg --list | grep libstdc++6 的输出更新了问题
  • 那个输出说你的 libstdc++ 是 10.2.0,所以逻辑上你必须安装 libstdc++6-10-dbg 包,根据你的 dpkg 输出还没有安装。您安装的那个 -amd64-cross 包用于交叉编译。
  • @Botje ,现在我运行sudo apt-get install libstdc++6-10-dbg 并更新了dpkg --list | grep libstdc++6 关于问题的输出。但是当我运行我的程序时,它仍然没有在堆栈帧上显示符号。

标签: c++ linux ubuntu gdb libstdc++


【解决方案1】:

背景故事:

几天前,我也对与您相同的问题感到好奇。但那是在CentOS

What can I do differently after I install those missing debug info packages for gdb?

您可以查看问题以查看我在搜索过程中学到了什么,我用这些先验知识解决了您的问题。

简而言之,同样的事情,在CentOS 中,困难归结为安装调试信息包。因为CentOS 中的gdb 告诉您需要安装某些调试信息文件的确切版本,并且它提供了完整的命令。

debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64

但是这个命令是行不通的,你需要手动add some package sources to install that

然而,一旦你成功安装了调试信息包,其他的一切都设置好了,甚至是源文件!您可以s 进入例如abort()list 围绕源代码!


Ubuntu:

  1. 您必须找到您的libstdc++.so.xxx 的确切版本并安装相应的调试信息文件。

  2. 安装相应的调试信息文件包后,不会安装和设置库(例如libstdc++)源文件。但是您可以使用 set substitute-path 手动完成。

回答部分:

我让我的gdbUbuntu 18.04.5 LTS 下工作。我认为这可能也适用于你的。

  1. 我假设你知道这个https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

所以首先我ldd my.a.out

libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fbfa6f84000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbfa697b000)
...

在我的 Ubuntu 中,读取 libc.so.6 的调试符号是成功的。所以我想检查.so 文件的.gnu_debuglink 部分。

libc.so.6 是指向libc-2.27.so 的链接

所以我用readelf -x.gnu_debuglink libc-2.27.so 阅读了上面的部分并给了我:

Hex dump of section '.gnu_debuglink':
  0x00000000 6c696263 2d322e32 372e736f 00000000 libc-2.27.so....
  0x00000010 32e033a0                            2.3.

表示其调试信息文件名为libc-2.27.so,存在于/usr/lib/debug/lib/x86_64-linux-gnu目录中。

现在检查libstdc++.so.6,这是我机器中libstdc++.so.6.0.25的链接。

readelf -x.gnu_debuglink libstdc++.so.6.0.25 给出:

Hex dump of section '.gnu_debuglink':
  0x00000000 31313961 34346139 39373538 31313436 119a44a997581146
  0x00000010 32306338 65396438 65323433 64373039 20c8e9d8e243d709
  0x00000020 34663737 66362e64 65627567 00000000 4f77f6.debug....
  0x00000030 30573da0                            0W=.

这个119a44a99758114620c8e9d8e243d7094f77f6.debug 是一个build-id 调试文件。

  1. 从您的问题和下面的 cmets 中学习,我做 dpkg --list | grep libstdc++ 并显示
ii  libstdc++-7-dev:amd64                      7.5.0-3ubuntu1~18.04                             amd64        GNU Standard C++ Library v3 (development files)
ii  libstdc++-8-dev:amd64                      8.4.0-1ubuntu1~18.04                             amd64        GNU Standard C++ Library v3 (development files)
ii  libstdc++6:amd64                           8.4.0-1ubuntu1~18.04                             amd64        GNU Standard C++ Library v3
ii  libstdc++6:i386                            8.4.0-1ubuntu1~18.04                             i386         GNU Standard C++ Library v3

所以我sudo apt install libstdc++6-8-dbg

然后我使用dpgk-query -L libstdc++6-8-dbg 来查看这些软件包安装了哪些文件。

tianhe@tianhe-windy:/lib/x86_64-linux-gnu$ dpkg -L libstdc++6-8-dbg
/.
/usr
/usr/lib
/usr/lib/debug
/usr/lib/debug/.build-id
/usr/lib/debug/.build-id/f2
/usr/lib/debug/.build-id/f2/119a44a99758114620c8e9d8e243d7094f77f6.debug
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/debug
/usr/lib/x86_64-linux-gnu/debug/libstdc++.a
/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6.0.25
/usr/lib/x86_64-linux-gnu/debug/libstdc++fs.a
/usr/share
/usr/share/doc
/usr/share/gdb
/usr/share/gdb/auto-load
/usr/share/gdb/auto-load/usr
/usr/share/gdb/auto-load/usr/lib
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/debug
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6.0.25-gdb.py
/usr/lib/x86_64-linux-gnu/debug/libstdc++.so
/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6
/usr/share/doc/libstdc++6-8-dbg

当我看到这一行时,我想我得到了调试文件:

/usr/lib/debug/.build-id/f2/119a44a99758114620c8e9d8e243d7094f77f6.debug.

然后我再次打开gdb,它就可以工作了。我现在可以s 进入string s = "hello";

所以尝试检查我上面描述的内容,看看它们是否匹配。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2021-03-22
    • 2020-10-10
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2020-09-30
    • 2021-06-05
    • 2020-11-04
    相关资源
    最近更新 更多