【问题标题】:How to setup a data breakpoint on a reference如何在引用上设置数据断点
【发布时间】:2018-08-09 21:30:09
【问题描述】:

我有一个对象的 64 位引用,其中引用的低 32 位被 0xFFFFFFFF 覆盖。我不知道如何在引用本身的字节上设置数据断点,因为监视窗口让我无法获取引用的地址。

【问题讨论】:

  • 一种可能的方法:找到一些代码,其中引用被初始化或值被更新。查看反汇编代码以了解代码如何访问引用以获取所引用的值。
  • Visual Studio 能否在特定地址设置数据断点?如果是这样,您可以找出与引用相邻的对象的地址,然后将其偏移。
  • 我不确定我是否理解问题所在。在数据断点对话框中添加 &yourreference 有什么问题?它也接受表达式。
  • 引用没有自己的内存地址(参见Is there any way to find the address of a reference?)。 &yourreference 返回yourreference 所指的地址,而不是yourreference 本身的地址。所以你不能直接在引用上设置数据断点,只能在它引用的地址上设置。把引用改成指针,就可以得到指针的地址,在上面设置数据断点。
  • @ZDF 引用通常使用指针实现。虽然引用在代码中没有可识别的地址,但它通常在内存中具有可寻址的值,您可以在调试器中看到。

标签: c++ visual-c++


【解决方案1】:

我看到了两种解决方案(如果我正确理解了问题):

  • 更改对指针的引用;
  • 在您的引用前面添加一个虚拟变量 - 请参见下面的代码 - 并将断点设置为其地址。

class object_t
{
public:
  int i;
};

class test_t
{
public:
  int64_t dummy {};
  object_t& ro;
  test_t( object_t& aro ) : ro { aro } {}
};

int main()
{
  object_t obj;
  test_t c { obj };

  // without dummy
  int64_t* p = (int64_t*)&c;
  *(int32_t*)p = 0xffffffff; // simulates memory corruption
  c.ro.i = 0; // exception

  // with dummy
  int64_t* p = (int64_t*)&c;
  *(int32_t*)p = 0xffffffff; // will break 

  return 0;
}

【讨论】:

  • 这是我最终做的,但这是在 boost beast 中,所以我不想改变它。哦,好吧,它奏效了。
【解决方案2】:

我不知道有什么直接的方法可以做到这一点。但是,这里有一个可能的解决方案:

  • 首先,找到变量的大致位置:如果旁边有一个变量,则获取它的地址。如果附近没有变量,那么如果堆栈上的引用,则获取堆栈指针(esp/rsp on x86)。如果引用位于不在堆栈上的对象中,则使用 this 指针。
  • 其次,利用内存窗口,到这个大概的地址,搜索引用的值,就在附近的某个地方。

【讨论】:

  • 我想一个更简单的解决方案是更改对指针的引用。
  • @ZDF:如果您愿意修改代码...但是如果这意味着很多更改(将. 更改为->,添加*)怎么办?如果引用是一个 const 引用,它有一个临时绑定怎么办?我概述的过程可以很快完成。也许重新编译/链接时间比我写的要长。
猜你喜欢
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 2020-01-11
相关资源
最近更新 更多