【发布时间】: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++