这个问题类似于打印虚拟成员函数的地址 https://stackoverflow.com/questions/3068144/print-address-of-virtual-member-function
我想使用成员函数指针检索函数的内存位置(在运行时)。目标是记录它们,并进行事后分析,使用 WinDbg 中的“ln”使用 PDB 符号检索它是哪个函数。
我无法使用堆栈遍历,因为我还没有进入我想要记录的函数。
(而且我不想修改数十亿个函数来返回它们的地址......)。
简短样本:
class AClass
{
public :
virtual AFunction(){;}
};
typedef void (AClass::*FxPtr)( void );
[...]
AClass oAClass;
AClass* pSelf = &oAClass;
FxPtr pf = &AClass::AFunction;
DWORD nFctAddress = ???
有人知道我如何检索地址吗?
&(pSelf->*pf)
给出“错误 C2298:“&”:对指向成员函数表达式的指针进行非法操作”
我知道成员函数指针是“奇怪”的结构,但是由于我知道“this”,有没有办法从 vtable 中查找潜在的虚拟函数?
Regards,
refs:
- 成员函数指针 http://www.codeproject.com/kb/cpp/FastDelegate.aspx
- 指向成员函数的指针是
非常奇怪的动物 http://blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002.aspx
#include <stdio.h>
struct Class {
virtual void AFunction( void ) { printf("1"); }
};
struct AClass : public Class {
virtual void AFunction( void ) { printf("2"); }
};
typedef void (AClass::*FxPtr)(void);
int main( void ) {
union {
FxPtr pf;
int rf[2];
};
pf = &AClass::AFunction;
printf( "sizeof(pf)=%i\n", sizeof(pf) );
printf( "%08X\n", pf );
printf( "%08X %08X\n", rf[0], rf[1] );
/*
error: ISO C++ forbids taking the address of a bound member function
to form a pointer to member function. Say '&AClass::AFunction'
AClass a;
FxPtr qf = &a.AFunction;
printf( "sizeof(qf)=%i\n", sizeof(qf) );
*/
};
访问vtable很容易,但通过地址来识别函数就没那么简单了。
一些选项:
1)解析.map文件,加载并通过typeid(或通过map中的VMT实例)查找类名,然后通过其名称查找函数地址。
2)编写一个静态函数,为给定对象调用给定的虚方法,看看它是如何实现的
查看asm,并从其代码中检索函数在vtable中的偏移量,然后读取地址
?adr_CFunction@Class@@SIXPAU1@@Z PROC ; Class::adr_CFunction, COMDAT
; _This$ = ecx
; 8 : static void adr_CFunction( Class* This ) { This->CFunction(); }
mov eax, DWORD PTR [ecx]
mov edx, DWORD PTR [eax+8]
jmp edx
?adr_CFunction@Class@@SIXPAU1@@Z ENDP ; Class::adr_CFunction
3)有一些漂亮的选项,例如“/Gh启用_penter函数调用”,它允许检索
所有函数的地址,虽然在调用之后,但在函数实际执行任何操作之前。然后.map可以用来通过trace来识别函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)