GDB 7.11
Kể từ GDB 7.11, GCC 5.3.1, Ubuntu 16.04, chỉ thực hiện:
p *myBase
trên một cái gì đó biên dịch với:
gcc -O0 -ggdb3
có thể đủ vì nó đã cho thấy:
$1 = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}
nơi MyDerived1
là lớp có nguồn gốc hiện tại chúng tôi đang tìm kiếm.
Nhưng nếu bạn làm ngoài:
set print object on
sản lượng thậm chí còn rõ ràng hơn và trông giống như:
$1 = (MyDerived1) {<MyBase> = {_vptr.MyBase = 0x400c00 <vtable for MyDerived1+16>}, <No data fields>}
này cũng ảnh hưởng đến các lệnh khác như:
ptype myBase
mà show :
type = /* real type = MyDerived1 * */
class MyBase {
public:
virtual int myMethod(void);
} *
thay vì:
type = class MyBase {
public:
virtual int myMethod(void);
} *
Trong trường hợp này, không có dấu hiệu của các loại có nguồn gốc mà không set print object on
.
whatis
bị ảnh hưởng tương tự như: chương trình
(gdb) whatis myBase
type = MyBase *
(gdb) set print object on
(gdb) whatis myBase
type = /* real type = MyDerived1 * */
MyBase *
Test:
#include <iostream>
class MyBase {
public:
virtual int myMethod() = 0;
};
class MyDerived1 : public MyBase {
public:
virtual int myMethod() { return 1; }
};
class MyDerived2 : public MyBase {
public:
virtual int myMethod() { return 2; }
};
int main() {
MyBase *myBase;
MyDerived1 myDerived1;
MyDerived2 myDerived2;
myBase = &myDerived1;
std::cout << myBase->myMethod() << std::endl;
myBase = &myDerived2;
std::cout << myBase->myMethod() << std::endl;
}
Nguồn
2016-05-05 15:14:47
Tôi không có gdb Wiz, nhưng bạn có thể có thể đi qua con trỏ v-bàn (đó là những gì cơ sở của bạn lớp con trỏ theo nghĩa đen chỉ đến) và giải quyết tên của các hàm. – selbie
@selbie tư vấn v-table là chính xác những gì ptype không dưới mui xe nếu {set print object on} đang hoạt động, như Beta chỉ ra trong câu trả lời của mình –