提问人:jww 提问时间:8/13/2017 更新时间:8/17/2017 访问量:2052
如何避免GDB中符号的命名空间前缀?
How to avoid namespace prefix for symbols in GDB?
问:
我正在使用 C++ 库。该库使用多个命名空间。调试时,我必须为每个符号名称加上命名空间前缀。它会导致大量额外的工作和打字。
C++ 的概念是使符号更容易可用(大量手弃)。我在 GDB 中寻找类似的。例如,我想 .using namespace X
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 使用命名空间前缀,这样我就不必为每个符号名称提供它?
答:
如何告诉 GDB 使用命名空间前缀,这样我就不必为每个符号名称提供它?
在当前的 GDB 中似乎没有任何此类支持(截至 2017 年 8 月 13 日)。
您可以使用 Python 脚本来实现它来定义新命令。文档。
请注意,这完全是一个不平凡的命题。
如何告诉 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 命令,用于获取实例并运行方法。
评论