Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MSVC2015中的固定基址_C++_Visual C++_Aslr - Fatal编程技术网

C++ MSVC2015中的固定基址

C++ MSVC2015中的固定基址,c++,visual-c++,aslr,C++,Visual C++,Aslr,我正在尝试调试应用程序中的内存泄漏。泄漏的对象有点难以识别(在销毁堆之前),并且创建了许多类似的对象。如果它在每届会议上都有相同的发言,这将使会议更加容易。因此,我试图在可执行文件的链接器属性中使用/FIXED和/DYNAMICBASE:NO禁用ASLR 然而,这似乎并没有达到预期的效果,每次的地址仍然不同。此外,即使是main中的argv的地址在每个会话中也是不同的。是否需要设置一些其他参数,或者我是否误解了这些标志的用途?您正在查看数据地址;ASLR主要用于代码。它确定加载EXE和DLL代码

我正在尝试调试应用程序中的内存泄漏。泄漏的对象有点难以识别(在销毁堆之前),并且创建了许多类似的对象。如果它在每届会议上都有相同的发言,这将使会议更加容易。因此,我试图在可执行文件的链接器属性中使用
/FIXED
/DYNAMICBASE:NO
禁用ASLR


然而,这似乎并没有达到预期的效果,每次的地址仍然不同。此外,即使是
main
中的
argv
的地址在每个会话中也是不同的。是否需要设置一些其他参数,或者我是否误解了这些标志的用途?

您正在查看数据地址;ASLR主要用于代码。它确定加载EXE和DLL代码段的位置


您可以覆盖
operator new
来控制内存分配,并使用具有定义基址的
VirtualAlloc
来使分配更具确定性(尽管仍可能存在多线程争用条件)。或者,使用MSVC默认堆调试工具通过其序列号而不是地址来识别块。

查找泄漏的最佳方法是使用Windows Crt调试功能,例如此处介绍的:@BitTickler-我已经知道哪个对象事后泄漏(就像CRT转储告诉我的一样——我有一个类似的泄漏报告系统),但是,我希望在分配对象时(以及在引用对象时)识别该对象,这就是为什么我需要分配地址保持不变。使用Crt调试功能,您可以做一些非常方便的事情。例如,在对象的分配号上设置断点。因此,首先使用Crt的东西来确定导致问题的分配,然后在下一次运行中,您可以中断它。这通常是我成功的途径我提到这个是因为我认为在活系统中发现逻辑错误是非常浪费时间的。如果你有一些线程相关的问题,当然有时候你只能做这些事情。你正在谈论一些其他的事情。对于Windows版本,我90%确信这是不可能的。可能是因为appcompat垫片禁用了它们,但Google还没有听说过。使用
\crtBreakAlloc
来获得成功。@HansPassant:事实上,这两者肯定是相关的。ASLR会忽略首选的基址,并重新定位可执行文件及其DLL。这当然是唯一的如果可执行文件可重新定位为从开始,则可能。
/FIXED
使基址成为必需而不是首选。而
/DynamicBase
正是ASLR标志。