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_processName
是 const std::string &
)
alt text http://img175.imageshack.us/img175/3561/43419953av1.jpg
请注意,该变量实际上包含有效数据 - 如果我将其打印到标准输出,打印的字符串就可以了,感谢您的询问。
更简单的数据类型(例如int
s)(通常?)会显示正确的值。
你也遇到过这种情况吗?
这是调试时的主要 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中检测到一个错误