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

Debugger shows npos=4294967295 when viewing string variables

本文关键字:显示 npos 4294967295 变量 字符串 调试器      更新时间:2023-10-16

我的问题基本上是,每当我使用Visual Studio(Windows 10计算机上的2015社区版)进行调试时,当我试图将鼠标悬停在某个变量上或在调试视图的locals或autos部分查看某个变量时,我看不到变量中保存的实际数据。

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

如果你一直点击下拉箭头,你最终会得到保存在该变量中的实际字符串;只有在深入研究变量的内部结构之后,如std::_String_alloc_Mypair_Myval等。向量也是如此。

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

我也遇到了同样的问题。我假设您正在调试一个非托管(本机)C++DLL,它是使用托管EXE的解决方案的一部分?在我的例子中,我有一个C#WPF EXE,它PInvoke非托管C++DLL中的函数。

在我的案例中起作用的"修复":

FIX 1:取消选中调试器设置中的"使用托管兼容模式":您可以在"工具"/"选项"/"调试"/"常规"中执行此操作。请参阅:https://stackoverflow.com/a/33462362/5556801有关什么是"托管兼容性模式"以及为什么通常希望取消选中它的一些讨论,请参阅:http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/switching-to-managed-compatibility-mode-in-visual-studio-2013.aspx

"FIX"2:作为部分解决方案,您可以首先在没有调试器的情况下启动进程(Ctrl+F5),然后将VS2015调试器附加到进程(调试/附加到进程),但只能使用"附加到/选择…"按钮选择"本机代码"。现在,当您的原生C++DLL中的断点被击中时,您可以将鼠标悬停在std::string变量上,VS2015将按预期显示其全部内容,包括其数据成员。这种本机代码只能解决的缺点是,您将无法同时调试托管代码(例如C#或CppCli)。

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

取消选中Debug->options->use native compatibility mode在尝试了以上所有答案后,我做得很好。

4294967295是0xffffffff,它是一个32位的字,全部为一位。在大多数机器上,这也是(unsigned)-1,它是通常的str::npos常数。

顺便说一句,你有没有试过用GCC用g++ -Wall -g编译你的代码?然后使用gdb进行调试。

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