Visual Studio:std :: string的乱码调试手表?

时间:2009-02-12 15:57:29

标签: c++ visual-studio debugging mixed-mode

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

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

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

这件事发生过吗?

调试时这是一个主要的PITA,所以......关于如何让手表显示正确数据的任何想法,或者是什么导致了这个?

6 个答案:

答案 0 :(得分:1)

看起来你的调试符号不正确。

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

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

糟糕的调用堆栈也可能导致这样的问题。确保堆栈没有任何条目,例如“此时堆栈可能不正确......”。是吗?

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

答案 1 :(得分:1)

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

请注意,您还可以为其他类型编写自己的可视化工具,更多信息herehere。这是复杂项目的主要节省时间,非常值得(小)努力编写自定义可视化工具。

答案 2 :(得分:1)

是的,我在我的调试器中看到了这个问题,在我的情况下它连接到 Unicode vs Non Unicode 。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

这是一个永久存在于Visual Studio调试器中的错误,至今仍在Visual Studio 2019中发生。

这是随机的。

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