gpt4 book ai didi

c++ - 为什么函数的地址会随着每次运行而改变?

转载 作者:太空狗 更新时间:2023-10-29 19:41:59 29 4
gpt4 key购买 nike

为了调试目的(获取调用堆栈),我正在努力将地址映射到它们的符号。 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 的绝对地址的不确定性,但不是主要的可执行文件。

在 Win7 和 VS2008 上试过。

最佳答案

关于c++ - 为什么函数的地址会随着每次运行而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16214502/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com