2010-10-22 331 views

回答

5

这意味着调试器无法计算出它的值。

例如,如果您的代码涉及HWND s,您会看到相当多的内容。如果你通过Windows的头文件,它是通过一个宏定义是这样的:

struct HWND__{int unused;}; typedef struct HWND__ *HWND; 

所以HWND类型是真正的类型“指针到HWND__”。但是,从CreateWindow()等函数获得的值HWND实际上并不是指向任何内容的指针。

但调试器会尝试找出在结构中的unused成员的值,但不能做到这一点:

Watch Window

您也将看到这些类型的错误时观察的变量类型信息不正确或缺失。

+0

不正确。该???错误字符串与错误类型信息有关。如果它不能评估表达式,它将提供更有用的错误消息 – JaredPar 2010-10-22 21:52:51

+0

@JaredPar:我的措辞有点偏离。我的意思是调试器无法弄清它的价值。 – 2010-10-22 22:03:48

+0

Gotcha。编辑版本解决了混乱。但它确实显示???对于不好的类型和不好的价值。 – JaredPar 2010-10-22 22:07:33

1

这是一个C++风格的项目吗?

调试器通常使用“???”字符串,当它能够评估表达式但不能获取显示的特定部分的任何类型信息时。这通常是因为缺少或不正确的PDB符号。

如果表达式访问损坏的数据(overriten虚拟表或RTTI),可能会出现这种情况。但我不会100%知道这是否属实。

1

通常这意味着指针或引用指向无法访问的内存,因此无法获取值。例如,如果你有一个应该指向Foo的指针,那么调试器通常会将指针指向的位作为Foo进行解释 - 指针是否有效。但是在某些情况下,野生指针可能指向一个甚至没有映射到进程空间的位置。在这种情况下,调试器无法获取这些位。

相关问题