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

How to avoid namespace prefix for symbols in GDB?

提问人:jww 提问时间:8/13/2017 更新时间:8/17/2017 访问量:2052

问:

我正在使用 C++ 库。该库使用多个命名空间。调试时,我必须为每个符号名称加上命名空间前缀。它会导致大量额外的工作和打字。

C++ 的概念是使符号更容易可用(大量手弃)。我在 GDB 中寻找类似的。例如,我想 .using namespace Xb MyLibNamespace::Foo::barb Foo::bar

GDB 似乎没有与命名空间相关的帮助,但我可能做错了什么:

(gdb) help namespace
Undefined command: "namespace".  Try "help".
(gdb) namespace help
Undefined command: "namespace".  Try "help".

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

C++ 命名空间 GDB

评论


答:

0赞 Employed Russian 8/14/2017 #1

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

在当前的 GDB 中似乎没有任何此类支持(截至 2017 年 8 月 13 日)。

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

请注意,这完全是一个不平凡的命题。

0赞 2785528 8/17/2017 #2

如何告诉 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 命令,用于获取实例并运行方法。