6

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

Ps:我给 GDB 的人发了邮件,他们说不可能用它来做。见下面他们的回答:

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

此致

4

2 回答 2

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当您希望该断点处于活动状态时,对象必须在范围内。当它超出范围时,断点将停止运行。

于 2019-08-06T12:31:26.590 回答
0

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

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

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

于 2019-07-16T11:33:17.940 回答