【问题标题】:How to avoid namespace prefix for symbols in GDB?如何避免 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 使用命名空间前缀,这样我就不必为每个符号名称都提供它?

【问题讨论】:

    标签: c++ namespaces 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.

      当心,这完全不是小事。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-25
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        相关资源
        最近更新 更多