从方法指针获取“真实”功能

时间:2014-01-10 06:27:14

标签: c++ portability introspection debug-symbols

给定一个c ++对象指针和指向虚方法的兼容方法指针,是否有任何远程健壮/可移植的方式来获取指向将被调用的实际Concert函数的指针?

用例是我想运行所述指针认为调试符号获取将被调用的类型/函数的名称(实际上没有调用它)。

如果这只能通过特定于实现的解决方案实现,那么我主要对支持GCC / LLVM感兴趣。

1 个答案:

答案 0 :(得分:0)

LLVM和GCC都遵循Itanium C++ ABI,因此您需要找到一种方法来读取其中指定的数据结构。我会给出一个粗略的轮廓。
指向虚拟成员的指针由虚函数表中的偏移量表示,由于某种原因+1。

class A {
public:
    virtual void f();
    virtual void g();
};

void (A::*pAg)() = & A::g;
ptrdiff_t offset = *(ptrdiff_t*)(&pAg) - 1;

指向虚拟表的指针通常位于对象的开头:

A a;
void* vtable = *(void**)&a;

然后查看该虚拟表中的计算偏移量并找到实际的函数指针。

void* function = *(void**)(vtable+offset)