我正在使用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使用名称空间前缀,这样我就不必为每个符号名称提供它?
答案 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命令,用于获取实例并运行方法。