【问题标题】:Fixed base address in MSVC2015MSVC2015 中的固定基地址
【发布时间】:2016-10-24 05:15:55
【问题描述】:

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

但是,这似乎并没有达到预期的效果,地址还是每次都不一样。此外,即使main 中的argv 的地址在每个会话中都不同。我需要设置一些额外的参数,还是我误解了这些标志的用途?

【问题讨论】:

  • 查找泄漏的最佳方法是使用 Windows Crt 调试功能,例如在此介绍:msdn.microsoft.com/en-us/library/x98tx3cf.aspx
  • @BitTickler - 我已经知道哪个对象在事后泄漏(就像 CRT 转储告诉我的那样 - 我有一个类似的泄漏报告系统),但是,我想在它被分配(以及在被引用时),这就是为什么我需要分配地址保持不变。
  • 借助 Crt 调试功能,您可以做一些非常方便的事情。就像在对象的分配号上设置断点一样。所以,首先使用 crt 的东西来识别导致问题的分配,然后在下一次运行中你可以打破它。这通常是我通往成功的道路……那,还有编写单元测试……我提到这一点是因为我认为在实时系统中查找逻辑错误是浪费时间。如果您有一些与线程相关的问题,当然有时您只能这样做。
  • 您在谈论 /dynamicbase 以外的其他内容,您希望关闭堆和堆栈地址随机化。对更高版本的 Windows 提出很大的要求,我 90% 确定这是不可能的。 Big 也许在禁用它们的 appcompat 垫片上,但 Google 还没有听说过。使用_crtBreakAlloc 取得成功。
  • @HansPassant:实际上,这两者肯定是相关的。 ASLR 忽略首选基地址并重定位可执行文件及其 DLL。这当然只有在可执行文件是可重定位的开始时才有可能。 /FIXED 使基地址成为强制而不是优先。而/DynamicBase 正是 ASLR 标志。

标签: c++ visual-c++ aslr


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2011-01-24
    • 2017-01-05
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多