C++ 调试器在查看字符串变量时显示npos=4294967295

C++ 调试器在查看字符串变量时显示npos=4294967295,c++,visual-studio,debugging,visual-studio-2015,C++,Visual Studio,Debugging,Visual Studio 2015,我的问题基本上是,每当我使用Visual Studio(Windows 10机器上的2015 Community edition)进行调试时,如果我试图将鼠标悬停在某个变量上,或者在调试视图的“局部变量”或“自动变量”部分查看某个变量,我就看不到该变量中保存的实际数据 这是我在字符串和向量中看到的一个问题。对于字符串,它将显示npos=4294967295 如果您一直单击下拉箭头,最终将获得保存在该变量中的实际字符串;只有在深入研究变量的内部结构后,如std::_String\u alloc和\

我的问题基本上是,每当我使用Visual Studio(Windows 10机器上的2015 Community edition)进行调试时,如果我试图将鼠标悬停在某个变量上,或者在调试视图的“局部变量”或“自动变量”部分查看某个变量,我就看不到该变量中保存的实际数据

这是我在字符串和向量中看到的一个问题。对于字符串,它将显示npos=4294967295

如果您一直单击下拉箭头,最终将获得保存在该变量中的实际字符串;只有在深入研究变量的内部结构后,如
std::_String\u alloc
\u Mypair
\u Myval
等,向量也是如此


有没有人遇到过这个问题,或者知道如何解决它?

4294967295是
0xffffffff
,它是一个包含所有一位的32位字。在大多数机器上,这也是
(无符号)-1
,这是通常的常量


顺便问一下,您是否尝试使用
g++-Wall-g
编译代码?然后使用
gdb
进行调试

我也有同样的问题。我假设您正在调试一个非托管(原生)C++ DLL,它是使用托管Exe的解决方案的一部分。在我的例子中,我有一个C++的WPF EXE,它调用了一个非托管C++ DLL中的函数。p> 在我的案例中起作用的“修复”:

修复1:取消选中调试器设置中的“使用托管兼容性模式”: 您可以在工具/选项/调试/常规中执行此操作。请参阅:有关“托管兼容性模式”是什么以及您通常希望取消选中它的原因的一些讨论,请参阅:

“修复”2:
作为部分解决方法,您可以首先在不使用调试器的情况下启动流程(Ctrl+F5),然后将VS2015调试器附加到流程(调试/附加到流程),但只能使用“附加到/选择…”按钮选择“本机代码”。现在,当您的本机C++ DLL中的断点被击中时,可以在STD::String变量和VS2015上悬停,如预期的那样,将显示其全部内容,包括它们的数据成员。此纯本机代码解决方案的缺点是无法同时调试托管代码(例如C#或CppCli)。

在项目属性中选择
调试->调试器类型->仅本机。在我的例子中,它是混合的

帮助我的是以管理员的身份运行VisualStudio(在我的例子中是2010)。否则npos错误仍然会出现,即使我应用了所有其他建议的解决方案。

取消选中
Debug->options->use native compatibility mode
在尝试了上述所有答案后,我发现它工作得很好。

是否显示了此问题的屏幕截图
std::string
确实有一个名为
npos
的静态成员,这是
std::string::size\u type
可以容纳的最大值。VS附带类似XML的文件,描述如何可视化std数据结构。不知怎的,这些都不适合你。我在其他人的机器上看到过这种情况,但我们从未找到解决方法。您确定要可视化的变量在当前范围内吗?否则,未初始化的变量是正常的。melak47是正确的,您可能应该在@melak47和BeyelerStudios上问这个问题。如果这两个都是正确的,您也可以尝试重新安装VS2015。我在第一次阅读时以完全相同的方式错过了问题的要点。问题不是问为什么std::string::npos是4294967295。问题是为什么VisualStudio显示
std::string::npos的值,而不是显示光标所在的特定字符串的值。std::string有多个成员,包括静态成员
npos
,因此调试器需要一些额外的知识才能向您显示字符串的“值”。修复1在VS2015中为我工作,感谢您为我节省了数小时的时间!