Base class로 부터 상속 받은 Derived class의 인스턴스를 Base class 포인터에 넣으면 GDB에서 타입이 제대로 표시되지 않는다. 이 때는 ‘set print object on’을 설정해서 GDB의 ptype <var> 명령 결과에 해당 인스턴스의 실제 타입이 함께 표시 되도록 할 수 있다.
예를 들어 다음과 같은 코드가 있다고 할 때
#include <iostream> using namespace std; class Base { public: virtual void identify() { cout << "Base class" << endl; } }; class Derived: public Base { public: void identify() override { cout << "Derived class" << endl; } }; int main(void) { // Derived class instance 이지만 // GDB에서 Base type으로 표시된다. Base *c = new Derived(); c->identify(); delete c; }
main() 함수 내의 “Base *c”를 GDB에서 확인해 보면 실제 인스턴스의 타입과 관련 없이 Base class로 표시된다.
(gdb) ptype c type = class Base { public: virtual void identify(void); } *
실제 인스턴스가 무엇인지 알고 싶다면, set print ojbect on을 설정해서 ptype 결과에 실제 인스턴스가 함께 표시되도록 할 수 있다. ( /* real type = … */)
(gdb) set print object on (gdb) ptype c type = /* real type = Derived * */ class Base { public: virtual void identify(void); } *
이 설정을 다른 유용한 것들과 함께 ~/.gdbinit에 넣어두면 gdb가 실행될 때 자동으로 설정된다.
$ cat ~/.gdbinit set print object on set print pretty on set print static-members on set print vtbl on