近期偶然用Windbg给一个控制台程序的入口函数下断点,地址之际用编译出的Map文件中main函数的地址。结果Windbg报告断点未下成功,经过反复查看,包括在VC环境中调试运行,均发现main函数的地址和Map文件中地址不一样,切带有随机性。
又用VC6.0实验一遍,发现没有任何问题。看来问题是出在编译器上。
最后经过朋友指点,发现竟然是VC2010的链接属性中,/DYNAMICBASE一直开着。所以每次运行入口地址都在随机变化!关闭后,重新编译,main函数入口不再变化了,按照Map文件地址,WinDbg也顺利下断。
/DYNAMICBASE:使用 Windows Vista /Windows 7的地址空间布局随机化 ASLR(Address Space Layout Randomization) 功能,指定是否生成可在加载时随机重新设定基址的可执行文件映像。这个功能VC2010默认开启,从Visual Studio® 2005 SP1 起增加了该设置的支持。据说是为了代码安全!