gpt4 book ai didi

c++ - 使用标准 C++ 库调试符号? Ubuntu/Linux/libstdc++6-8-dbg?

转载 作者:太空狗 更新时间:2023-10-29 12:39:08 30 4
gpt4 key购买 nike

在 Ubuntu Linux(撰写本文时的最新版本)上有一个名为 libstdc++6-8-dbg 的软件包。

它被描述为:

GNU Standard C++ Library v3 (debugging files) This package contains the shared library of libstdc++ compiled with debugging symbols.

除其他内容外,它还包含这些文件:

/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

通常要用 gcc 编译一个(单个翻译单元)C++ 程序,你可以这样写:

$ g++ myprogram.cc

要添加生成用户代码的调试符号,您可以传递 -g:

$ g++ -g myprogram.cc

但这不包括标准库的调试版本。

您需要将哪些额外选项传递给 g++ 以告诉它使用 libstdc++6-8-dbg 提供的标准库的调试版本?

最佳答案

OP 希望在回溯中正确解析 C++ 标准库的符号。 John's answer正确地指出这可以通过链接标准库的调试版本来实现。

不过,Ubuntu也提供了debug symbol packages一旦安装,它允许 GDB 解析标准库中的符号,其调试符号已被删除,即在标准库的 release 版本中。我们在下面提供了一个操作示例(我使用的是 Ubuntu 20.04):

假设生成的二进制文件名为 a.out。我们首先找到它链接的 libstdc++ 版本:

$ ldd a.out
...
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff8dc6f7000)
...

我们搜索提供共享库文件的包(/lib是/usr/lib的符号链接(symbolic link),这里必须使用完整路径。):

$ dpkg -S /usr/lib/x86_64-linux-gnu/libstdc++.so.6
libstdc++6:amd64: /usr/lib/x86_64-linux-gnu/libstdc++.so.6

关注instructions为调试符号包添加 repo,然后更新包索引。该链接还描述了如何搜索调试符号包,但我直接使用包名进行搜索:

$ apt list libstdc++6\*
...
libstdc++6-dbgsym/focal-updates 10.2.0-5ubuntu1~20.04 amd64
...

会有大量的结果,但一定要注意 dbgsym,而不是 dbg!安装 libstdc++6-dbgsym 后,GDB 应该能够解析符号,即使您的二进制文件未链接到调试库也是如此。


上面的文字应该回答 OP 的问题。现在我指出 John 的回答有一个问题。

GDB automatically reads in the debug symbols once you've installed the package. You don't need to compile your program any differently.

此陈述 100% 正确,但包含的数字无关紧要,不能证明该陈述。这里涉及三个密切相关的概念:

  • 调试库包:libstdc++6-8-dbg 包提供了带有调试符号的 libstdc++ 库版本。
  • 调试符号包:libstdc++6-dbgsym 包为 libstdc++ 库提供调试符号。也就是说,它不包含任何像 printf 这样的函数的机器指令,只包含调试符号。 libstdc++6-8-dbg 将代码和调试符号捆绑到一个库中。
  • 发布库包:包libstdc++6-8libstdc++6提供了标准库的发布版本,即不携带调试符号,只有代码。调试符号包应与发布库一起使用。

GDB会自动读取调试符号包中的调试符号,但不会读取调试库中的调试符号。 John 图中的 auto-load 只是说明 Python 脚本/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/debug/libstdc++.so.6.0.25-gdb.py会在调试库加载时自动运行,与调试符号的自动加载无关。

关于c++ - 使用标准 C++ 库调试符号? Ubuntu/Linux/libstdc++6-8-dbg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55718257/

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