如何避免 GDB 中符号的命名空间前缀?
Posted
技术标签:
【中文标题】如何避免 GDB 中符号的命名空间前缀?【英文标题】:How to avoid namespace prefix for symbols in GDB? 【发布时间】:2018-01-21 03:11:41 【问题描述】:我正在使用 C++ 库。该库使用多个命名空间。调试时,我必须在每个符号名称前加上命名空间前缀。这会导致大量额外的工作和打字。
C++ 具有using namespace X
概念,可以更轻松地使用符号(无需手动操作)。我在 GDB 中寻找类似的东西。例如,不是b MyLibNamespace::Foo::bar
,而是b Foo::bar
。
GDB 似乎没有与命名空间相关的帮助,但我可能做错了什么:
(gdb) help namespace
Undefined command: "namespace". Try "help".
(gdb) namespace help
Undefined command: "namespace". Try "help".
如何告诉 GDB 使用命名空间前缀,这样我就不必为每个符号名称都提供它?
【问题讨论】:
【参考方案1】:如何告诉 GDB 使用命名空间前缀,这样我就不必提供 它适用于每个符号名称?
您可以考虑一种变通方法...
我(有时)在我的类定义文件中添加了一个或多个 (C++) 函数。 (.cc),但它们不是类的一部分。
它们不是应用程序的一部分,当您使用它们时会被无害地删除。
他们通常“转储”信息(名称为 d1()、d2() 等)
但它们实际上也可以为您的调试工作做任何有用的事情,通常情况下,您不会提前考虑到这个特定的测试工作。
因此,您的编辑/编译/链接迭代很简单:停止 gdb,打开文件,添加有用的函数、行,然后恢复 gdb。保持这个“诊断”代码简单。希望结果最终能节省时间。
目前我找不到任何示例(在我的文件中)。我想一旦我克服了一个特定的挑战,我就会很快放弃这些功能。
无论如何...这个演示在几分钟前就开始运行了...
当在我的类 Foo_t、命名空间 DTB 的一部分等附近的 gdb 中工作时,我创建的 d1 知道如何访问 Foo_t 的特定实例(以某种方便的方式),并且可以轻松转储当前状态使用 Foo 方法执行此操作的实例。也许 d1 可以是这样的:
void d1() objDer.f("xxx"); // a derived instance,
// the class has a long complex name.
现在,在 gdb 中,当该实例存在并被初始化时,运行到某个断点,然后使用 gdb print 命令运行 d1 ...
(gdb) p d1()
这是一个短 gdb 命令,用于获取实例并运行一个方法。
【讨论】:
【参考方案2】:如何告诉 GDB 使用命名空间前缀,这样我就不必为每个符号名称都提供它?
当前 GDB 中似乎没有任何此类支持(截至 2017-08-13)。
您可能可以使用 Python 脚本来定义新命令来实现它。 Documentation.
当心,这完全不是小事。
【讨论】:
以上是关于如何避免 GDB 中符号的命名空间前缀?的主要内容,如果未能解决你的问题,请参考以下文章