之前有介绍过如何使用gdb来查看当前指针具体属于哪个派生类以及派生类的具体内容(gdb查看指针内容),那么对于复杂项目的调试,配合VsCode的断点和单步调试功能(VsCode单步调试),如果能够实时查看当前指针指向的所有内存信息,将大大提升debug的效率,本节将介绍如何实现,首先给出示例代码:
#include <iostream>
class Animal
{
public:
Animal():animalAge(11)
{}
virtual void Foo(){
};
virtual void Boo(){
};
private:
int animalAge;
};
class Fish: public Animal
{
public:
Fish():fishAge(22){}
virtual void Foo(){
}
int fishAge;
};
class GoldFish: public Fish
{
public:
GoldFish():goldFishAge(33){}
virtual void Foo(){
}
int goldFishAge;
};
int main() {
Animal *p1 = new Animal();
Animal *p2 = new Fish();
Animal *p3 = new GoldFish();
std::cout << "finish" << std::endl;
return 0;
}
我们将断点设置到38行,并执行VsCode单步调试功能执行到这个位置,此时指针p1 p2和p3分别指向3个类构建的内存。此时,VsCode的调试控制台可以通过 -exec " gdb指令 "的方式执行gdb调试,参考上一节,首先输入:
-exec set p obj on
-exec set p pretty on
开启查看类详细细细,如下图
以p3为例,查看p3指针信息和内容信息,输入:
-exec p p3
-exec p *p3
如下图
细心点会发现,把断点设置在main函数入口处,然后执行:
-exec set p obj on
-exec set p pretty on
之后再单步调试,会发现左侧运行和调试中的局部变量就可以显示继承关系和内存所有内容了,如下图:
这样我们就可以获取值针指向的详细内容,而不是只是获取基类相关的一些基本信息,非常有利于提升debug效率。