【问题标题】:Debugger shows npos=4294967295 when viewing string variables调试器在查看字符串变量时显示 npos=4294967295
【发布时间】:2016-02-11 15:04:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你显示这个的屏幕截图吗? std::string 确实有一个名为 npos 的静态成员,这是 std::string::size_type 可以容纳的最大值。
  • VS 带有描述如何可视化标准数据结构的类似 XML 的文件。不知何故,这些对你不起作用。我在别人的机器上看到过这种情况,但我们从来没有想出如何解决它。
  • 您确定您尝试可视化的变量在您当前的范围内吗?否则看起来未初始化的变量是正常的。
  • melak47 是对的,你应该在social.microsoft.com forums 上问这个问题
  • @melak47 和 BeyelerStudios 都是正确的,你也可以尝试重新安装 VS2015。

标签: c++ visual-studio debugging visual-studio-2015


【解决方案1】:

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

顺便说一句,您是否尝试过使用GCC 来编译带有g++ -Wall -g 的代码?然后使用gdb 进行调试。

【讨论】:

  • 我在第一次阅读时以完全相同的方式错过了问题的重点。问题不是问为什么 std::string::npos 是 4294967295。问题是问为什么 Visual Studio 显示 std::string::npos 的值而不是显示光标所在的特定字符串的值。 std::string 有多个成员,包括静态成员 npos,因此调试器需要一些额外的知识才能向您显示字符串的“值”。
【解决方案2】:

我遇到了同样的问题。我假设您正在调试一个非托管(本机)C++ DLL,它是使用托管 EXE 的解决方案的一部分?就我而言,我有一个 C# WPF EXE,它在非托管 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

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

【讨论】:

  • Fix 1 在 VS2015 中为我工作,感谢您节省了我的时间!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    帮助我的事情是以管理员身份运行 Visual Studio(在我的情况下为 2010)。否则,即使我应用了所有其他建议的解决方案,npos-bug 仍然会发生。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-11
        • 1970-01-01
        • 2011-03-13
        • 2013-08-31
        • 2010-10-06
        • 1970-01-01
        • 2011-01-29
        • 2011-02-21
        • 2018-02-10
        相关资源
        最近更新 更多