我需要研究类的构造函数如何初始化其对象。
我拥有的关于构造函数行为的关键信息是:
- 构造函数填充对象的 vtable。
- 构造函数没有名称,因此没有函数指针。
我怎样才能编写代码:
- 给我构造函数的地址?
- 跟踪对象的初始化?
提前致谢。
我需要研究类的构造函数如何初始化其对象。
我拥有的关于构造函数行为的关键信息是:
我怎样才能编写代码:
提前致谢。
获取构造函数地址的更好方法是编写一个包装模板函数new
(使用 C++11 完美转发,您只需要一个)并获取它的地址。
- 给我构造函数的地址?
不幸的是,这将是特定于平台的,并且需要使用汇编语言。您可以使用的基本技术是调用一个函数,该函数返回来自调用者的下一条指令的地址。从那里,您可以通过查看编译器生成的构造函数的汇编语言源代码,确定构造函数代码在内存中的实际地址。这个想法是查看调用函数的地址,然后从该地址中减去构成构造函数的任何先前命令使用的字节数。之所以需要使用汇编语言源代码,是因为您无法从原始 C++ 代码中确定机器语言命令的内存占用量。如前所述,这将是高度平台和编译器特定的,
例如,在 x86_64 上,您可以执行以下操作来获取调用者中下一条指令的地址:
在get_next_instruction_address.h
extern "C" unsigned long get_return_address();
在get_next_instruction_address.S
.section .text
.global get_next_instruction_address
get_next_instruction_address:
movq (%rsp), %rax
ret
现在,当您调用 时get_next_instruction_address()
,返回的值将是函数调用完成后下一条指令(在汇编中)的值。使用在构造函数的汇编代码中发生函数调用的位置将允许您回溯并查看构造函数开头的地址值是什么。