我正在尝试调试应用程序中的内存泄漏。泄漏的对象有点难以识别(在销毁堆之前),并且创建了许多类似的对象。如果每个会话都有相同的地址,那么它将变得相当容易。因此,我试图在我的可执行文件的链接器属性中使用/FIXED
和/DYNAMICBASE:NO
禁用ASLR。
但是,这似乎没有达到预期的效果,每次地址仍然不同。此外,即使argv
中main
的地址每个会话都不同。我需要设置一些额外的参数,还是我在某种程度上误解了这些标志的用途?
答案 0 :(得分:4)
您正在查看数据地址; ASLR主要用于代码。它确定加载EXE和DLL代码段的位置。
您可以覆盖operator new
来控制内存分配,并使用VirtualAlloc
和定义的基址来使分配更具确定性(但仍然可能具有多线程竞争条件)。或者,使用MSVC默认堆调试工具通过其序列号而不是其地址来标识块。