Visual Studio:std::string 的乱码调试监视?

Posted

技术标签:

【中文标题】Visual Studio:std::string 的乱码调试监视?【英文标题】:Visual Studio: Garbled debug watch of std::string's? 【发布时间】:2010-10-07 05:12:38 【问题描述】:

当我在 Visual Studio 2005 中调试 C++ 混合(托管/非托管)项目时,我经常从调试监视中得到奇怪的数据,如下所示: (顺便说一句,变量 i_processNameconst std::string &

alt text http://img175.imageshack.us/img175/3561/43419953av1.jpg

请注意,该变量实际上包含有效数据 - 如果我将其打印到标准输出,打印的字符串就可以了,感谢您的询问。 更简单的数据类型(例如ints)(通常?)会显示正确的值。

你也遇到过这种情况吗?

这是调试时的主要 PITA,所以...关于如何让手表显示正确数据的任何想法,或者是什么原因造成的?

【问题讨论】:

如果在内存窗口中输入字符串缓冲区的地址会发生什么? 图片来自 imageshack :( 【参考方案1】:

这是一个一直存在于 Visual Studio 调试器中的错误,并且在 Visual Studio 2019 中仍然存在。

这是随机的。

有时更改代码并重新编译可以解决问题,但有时不能。

【讨论】:

【参考方案2】:

我相信 Aardvark 可能是正确的答案。如果我在编译混合模式时没记错的话,编译器会将尽可能多的 C++ 代码转换为在 CLR 上运行的代码,从而转换为 CLR 拥有的内存。我的猜测是调试器对字符串的保存位置感到困惑 - 非托管或托管内存。

【讨论】:

【参考方案3】:

一个想法——std::string 的 STLPort 实现使用了拆分缓冲区实现。它有一个小的静态缓冲区(我想说 14 个字符)和一个指向 char 数组的指针。其中一个将是无效的,另一个将包含字符串数据,具体取决于存储字符串的长度。如果您使用的是 STLPort 或类似的实现,您的字符串可视化工具可能正在查看错误的缓冲区,而该缓冲区恰好包含垃圾数据。

【讨论】:

【参考方案4】:

您的调试符号似乎不正确。

检查模块调试窗口(菜单:Debug>Windows)。检查您正在调试的模块是否已“加载符号”。列在符号状态列下。检查列出的符号文件是您认为应该是的文件。您可以右键单击一个模块并获取有关 VS 如何加载符号的更多信息,您也可以重新加载它们。

如果您遇到符号加载问题,您可以在工具>选项>调试>符号下设置路径和其他设置。

错误的调用堆栈也可能导致此类问题。确保堆栈没有任何条目,例如“堆栈对于这一点可能不正确......”。是吗?

Visual Studio 在可视化工具中混淆原生数据类型和托管数据类型也可能有些奇怪,但我对此表示怀疑。屏幕截图中的弹出窗口看起来像是调试器知道变量是什么。

【讨论】:

您能详细说明一下吗?谢谢。【参考方案5】:

是的,我在调试器中看到了这个问题,在我的例子中,它连接到 Unicode 与 NonUnicode

【讨论】:

【参考方案6】:

自定义类型(包括 STL)的调试显示取决于位于 <install_path>\Common7\Packages\Debugger 文件夹中的文件 autoexp.dat。确保您的库版本与您的库版本匹配,并且该文件的旧版本没有保留(例如升级时)。

请注意,您还可以为其他类型编写自己的可视化工具,更多信息 here 和 here。对于复杂的项目来说,这可以节省大量时间,非常值得为编写自定义可视化工具付出(少量)努力。

【讨论】:

以上是关于Visual Studio:std::string 的乱码调试监视?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio:std::string 的乱码调试监视?

错误与否? Visual Studio 2013 预览 std::vector 初始化列表与 std::string

Windows Visual Studio C++ 列表列表

Microsoft visual studio C 运行时库 在 xx.exe中检测到一个错误

如何在函数重载的情况下选择性地替换 Visual Studio 中的函数?

Visual C++ 2010 在调试时拒绝显示 std::string 值。显示 <Bad Ptr>