2

如何在 Visual Studio 调试器监视窗口(或其他地方?)中找出堆栈上变量的地址

读取变量工作正常:

streets     streets [11790](0x1c66a690 [...] std::vector<Street *,std::allocator<Street *> >

但前缀 & 并没有给我一个地址:

&streets        streets [11790](0x1c66a690 [...] std::vector<Street *,std::allocator<Street *> >

另外,尝试读取大小不起作用,这是为什么呢?

streets.size()  CXX0075: Error: Cannot set up Function Evaluation   

该程序在调试模式下编译。

4

2 回答 2

5

Visual Studio 调试器通过一个名为autoexp.dat的文件中的架构定义的转换来驱动调试器监视、快速监视、自动和局部变量视图(取决于您的 VS 版本,其中的内容可能会有很大差异)。该文件位于您的 VS-InstallDir/Common7/Packages/Debugger 文件夹中(至少它适用于 VS2010 和 VS2012)。

知道了这一点,您可以尝试/考虑一些想法:

方法一:图书馆知识

要访问向量中第一个元素实际地址,我最终只是这样做:

streets._Myfirst

如果您知道要查看的元素数量,可以通过以下方式使用数组扩展扩展:

streets._Myfirst,N

其中N是元素的数量

注意:这仅适用于如上所示的向量。具体做法因您使用的容器而异。毫无疑问,有一些更简单的方法可能不太依赖于 std::vector<> 的实现,但这是我知道如何让你快速启动和调试的最简单的方法。


方法二:焦土

在工具/选项/调试/常规下是您可以打开和关闭的功能列表。您会发现其中一个对这个问题特别有用:

在可变窗口中显示对象的原始结构。

打开此选项可查看所有结构和容器的原始成员变量,包括标准容器,如 std::vector<>。这有效地禁用了autoexp.dat中模板的使用

于 2012-11-16T18:36:06.270 回答
4

要查看地址,请转换为void *,如下所示:(void *)&streets

这是 Visual Studio 通过直接向您显示指向的向量来提供帮助的尝试。类似的问题会影响向量数组。

于 2012-11-16T18:48:43.773 回答