【问题标题】:GDB: There is no member named ""GDB:没有名为“”的成员
【发布时间】:2021-10-28 16:06:07
【问题描述】:

我正在编写一些代码,这些代码从一个更大的项目中调用一些类。我们将这个大型项目称为 SampleProject。我有一个名为 libSampleProject.a 的 SampleProject 静态库。我无法展示实际代码,但我会提供一些示例:

假设 SampleProject 在名为 SamplePointers.cpp 的源文件中有一个名为 SamplePointers 的类。

在 SamplePointers.cpp 中,有指向 SampleProject 中其他类的指针。 所以比如有一个类叫ReadXml,ReadXml是SamplePointers类的成员作为指针。

class SamplePointers {
    public:
        ReadXml * readXmlObject;
        <MANY OTHER POINTERS TO CLASSES>
}

仅供参考:指针在 SamplePointers 类的构造函数中初始化。

在我的 CPP 文件 main.cpp 中,我调用的类如下所示:

#include <iostream>
#include <SampleClass.hpp>

int main() {
    SamplePointers * sampleObject = new SamplePointers;
    sampleObject->read("sampleFile.xml");
    std::cout << sampleObject->readXmlObject->xmlDataField << "\n";
}

SamplePointers 还有一个读取 XML 字段的读取函数。通过访问成员变量,这些字段将在 ReadXml 类中可用。运行这个可执行文件,xmlDataField 的值会打印出来。但是,在 GDB 上调试时,我在 read 行上设置了一个断点,然后我输入这个路径,sampleObject->readXmlObject->xmlDataField,回车,然后 gdb 说没有名为 readXmlObject 的成员.

这很奇怪,因为我可以使用 std::cout 将其打印出来,但 gdb 无法物理访问对象成员变量。

知道为什么 gdb 无法访问成员吗?

示例 GDB 输出:

(gdb) file out
(gdb) b 7
(gdb) run
(gdb) <breaks at line 7>
(gdb) p sampleObject->readXmlObject->xmlDataField
There is no member named readXmlObject

另外,看看 Makefile 的样子:

INCLUDES = -I/path/to/SamplePointersHeader -I/path/to/ReadXmlHeader -I/many/more/headers
main:
    g++ main.cpp $(INCLUDES) -L/path/to/SampleProjectLib -lSampleProject -o out
debug:
    g++ -g main.cpp $(INCLUDES) -L/path/to/SampleProjectLib -lSampleProject -o out

【问题讨论】:

  • 库需要编译调试信息吗?我不怎么用 gcc。
  • 不,这是专门添加在那里的,所以 gdb 可以看到这些符号。在这篇文章中,我不一定需要它来正确编译。我将帖子编辑为具有两个不同的 Makefile 目标。
  • 如果要解析符号,必须使用-g 编译。这个 makefile 不是很有用(为什么不只有一个 shell 脚本?)但是当你调试它时你是先运行make debug 吗?当您启动 GDB 时,它是否会打印任何有关调试程序的消息,例如“未找到调试符号”?
  • 你在这里提供了很多信息,但不是真正重要的信息:你调用的 GDB 命令行的剪切和粘贴以及你得到的输出。
  • @MadScientist 是的,我当然是用 -g 编译的,否则我将看不到符号。我添加了 gdb 会话的样子。

标签: c++ debugging makefile g++


【解决方案1】:

感谢@G.M. 的建议。我相信问题可能是当我创建库时,我在没有调试标志的情况下编译它,即-g 标志。我重新编译了库,从目标文件中创建了库,甚至将优化级别从 -O3 更改为 -O0,这将有助于调试。

然后我用新创建的库重新编译了我的main.cpp 文件,通过 GDB 传递它,它能够找到类成员。

感谢您的所有意见!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-23
    • 2014-11-09
    • 2015-06-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2013-05-23
    • 2014-08-26
    相关资源
    最近更新 更多