- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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-8
和libstdc++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/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!