如何避免GDB中符号的名称空间前缀?

时间:2017-08-12 20:58:30

标签: c++ namespaces gdb

我正在使用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使用名称空间前缀,这样我就不必为每个符号名称提供它?

2 个答案:

答案 0 :(得分:0)

  

如何告诉GDB使用名称空间前缀,以便我不必为每个符号名称提供它?

目前的GDB似乎没有任何此类支持(截至2017-08-13)。

您可以使用Python脚本来实现它来定义新命令。 Documentation

请注意,这完全是非平凡的主张。

答案 1 :(得分:0)

  

如何告诉GDB使用名称空间前缀,所以我不必提供   它适用于每个符号名称?

您可以考虑解决方法......

我(有时)在我的类定义文件中添加了一个或多个(C ++)函数。 (.cc),但他们不属于班级。

它们不是应用程序的一部分,并且在您完成它们时会被无害地删除。

他们通常会“转储”信息(名称为d1(),d2()等)

但它们几乎可以做任何对调试工作有用的事情。通常情况下,你不会提前考虑这个特定的测试工作。

因此,您的编辑/编译/链接迭代很简单:停止gdb,打开文件,添加有用的函数,行和恢复gdb。保持这个'诊断'代码简单。希望结果最终能节省时间。

目前我找不到任何示例(在我的文件中)。我想,一旦克服了特定的挑战,我就会迅速放弃这些功能。

无论如何......这个演示只是在几分钟前发挥作用......

当在我的类Foo_t附近的gdb中工作,命名空间DTB的一部分等时,我创建的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命令,用于获取实例并运行方法。