【问题标题】:Visual studio: set a data breakpoint at a memory ACCESS (i.e. when data is READ)Visual Studio:在内存访问处设置数据断点(即读取数据时)
【发布时间】:2013-05-14 16:51:27
【问题描述】:

我真的需要弄清楚我的 Fortran 项目何时读取向量的元素。我每天都使用数据断点,但是当我的代码访问(即读取)内存地址时,我找不到设置数据断点的方法,而我总是将其设置为在修改地址时中断。有没有办法在 Visual Studio 2010 上做到这一点? (我使用 intel visual fortran compose XE 2011 作为编译器)。或者可能更新到更新的视觉工作室? 就像一个注释,我在这里看到 gdb 这样做Can I set a breakpoint on 'memory access' in GDB? 谢谢 A.

Ps:我给 GDB 的人发了邮件,他们说不可能这样做。请参阅下面的答案:

你好, 当前,创建的观察点类型被硬编码为“写入”。这是因为 Visual Studio 不支持其他类型的观察点(在 GUI 和基础结构中)。 也许可以在 GDB 控制台中启用读取观察点, 但是它也需要破解,因为控制台实际上是“通过”工作的 Visual Studio(它不直接将命令传递给 GDB)。 我也不确定这个功能在 GDB 中是否真的有效。 GDB有很多 目标范围非常有限的命令,例如他们只工作 用于单线程程序,或仅用于 Linux 而不是在使用时 gdbserver 等。读取观察点看起来像一个机制,非常 平台相关。请检查您的平台是否支持读取观察点的 GDB。 如果此功能对您很重要,请告诉我们。

最好的问候

【问题讨论】:

  • 谢谢,windbg 没有这样做,请通过开发人员的电子邮件检查我编辑的问题。 cdb 是否也与 Fortran 一起工作?我用谷歌搜索了它,但我找不到 Visual Studio 的插件。你知道吗?
  • 请问您有更新吗?

标签: visual-studio-2010 breakpoints


【解决方案1】:

您可以使用 Mike Morearty 的Hardware Breakpoints

我还没有在 Visual Studio 2010 上测试过,但我已经在 VS 2008、2015 和 2017 中成功使用过。

int x = 0;
HardwareBreakpoint hb;
hb.Set(&x, sizeof(x), HardwareBreakpoint::Read);
// Some random code.
int y = x; // The breakpoint pauses the execution on this line.

请注意,HardwareBreakpoint 对象必须在范围内,而您希望该断点处于活动状态。当它超出范围时,断点将停止运行。

【讨论】:

    【解决方案2】:

    一些解决方法(using WinDBG 除外):

    1. 注入一个 NaN 值,如果它是关于浮点元素的。并启用trapping of operations with NaN。这不会捕获读取,而是捕获该值的第一个算术运算。因此将错过元素的复制,但尝试执行操作将引发 FP 异常,暴露它发生的位置。

    2. 使用该值取消映射内存页面。这是非常不准确的,并且会对访问该值周围的 4Kb 数据做出反应……但在某些情况下它仍然可能有效。检查MapUserPhysicalPages() 的说明(适用于 Windows)和munmap() 的说明(适用于 Linux)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多