如何避免 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 中符号的命名空间前缀?的主要内容,如果未能解决你的问题,请参考以下文章

命名空间

Atitit xml命名空间机制

laravel入门教程

如何将命名空间前缀设置为有效负载 xsl

XSLT 将命名空间前缀添加到元素最佳实践

如何更改命名空间的前缀?