我认为这里的问题(至少在 Linux 上)可能是 gdb 试图从文档中提供帮助:
设置禁用随机化
设置禁用随机化
此选项(在 gdb 中默认启用)将关闭已启动程序的虚拟地址空间的本机随机化。此选项对于多个调试会话很有用,以使执行具有更好的可重现性,并且内存地址可跨调试会话重用。
此功能仅在 gnu/Linux 上实现。您可以使用相同的行为
(gdb) set exec-wrapper setarch `uname -m` -R
http://sourceware.org/gdb/current/onlinedocs/gdb/Starting.html
更新:我现在已经检查过了,对我来说似乎确实如此(运行 Linux 2.6.28)。编译一个简单的 Hello World 程序并在没有命令行参数的情况下启动 gdb(我们不想在覆盖 disable-randomization 设置之前加载程序),然后输入:
(gdb) set disable-randomization off
(gdb) file ./a.out
(gdb) break main
(gdb) run
(gdb) disas printf
每次程序运行时printf的地址都不一样。