我正在努力将地址映射到它们的符号以进行调试(获取调用堆栈)。MS dbghelp.dll 可以从地址中分辨出符号(请参阅SymFromAddr
,MSDN)。但是,它不起作用,我想知道这怎么可能起作用,因为地址似乎随着程序的每次运行而改变:
#include <iostream>
void Foo() {}
int _tmain(int argc, _TCHAR* argv[])
{
const long unsigned int addr = reinterpret_cast<long unsigned int>(&Foo);
std::cout << "Address: " << std::hex << addr << std::endl;
return 0;
}
输出:
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 901320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: ce1320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 3a1320
D:\dev\Sandbox\Debug>Sandbox.exe
Address: 3f1320
不同的程序怎么会像从堆栈跟踪中读取地址并将其映射到函数?这对我来说听起来很神奇。我在链接的文档中没有找到任何内容说我必须从地址或其他内容中减去一些内容。
据我了解,因为我们克服了实模式,所以每个进程都有一个虚拟内存空间,所以不再需要为加载地址掷骰子了。如果是 DLL,我会理解绝对地址的不确定性,但不是主要的可执行文件。
用VS2008在Win7上试过。