当我在Visual Studio 2005中调试C ++混合(托管/非托管)项目时,我经常从调试手表中获得奇怪的数据,如下所示:
(顺便说一句,变量i_processName
是const std::string &
)
alt text http://img175.imageshack.us/img175/3561/43419953av1.jpg
请注意,变量实际上包含有效数据 - 如果我将其打印到stdout,打印的字符串就可以了,谢谢你的询问。
更简单的数据类型(例如int
s)(通常是?)会显示正确的值。
这件事发生过吗?
调试时这是一个主要的PITA,所以......关于如何让手表显示正确数据的任何想法,或者是什么导致了这个?
答案 0 :(得分:1)
看起来你的调试符号不正确。
检查模块调试窗口(菜单:Debug> Windows)。检查您正在调试的模块是否已加载“符号”。列在“符号状态”列下。检查列出的符号文件是否是您认为应该的文件。您可以右键单击模块并获取有关VS如何加载符号的更多信息,您也可以重新加载它们。
如果您遇到符号加载问题,可以在工具>选项>调试>符号下设置路径和其他设置。
糟糕的调用堆栈也可能导致这样的问题。确保堆栈没有任何条目,例如“此时堆栈可能不正确......”。是吗?
Visual Studio中的本机和manged数据类型混淆也可能有些奇怪,但我对此表示怀疑。屏幕截图中的弹出窗口看起来像调试器知道变量是什么。
答案 1 :(得分:1)
自定义类型的调试显示(包括STL)取决于位于autoexp.dat
文件夹中的文件<install_path>\Common7\Packages\Debugger
。确保您的库版本与您的库版本匹配,并且该文件的旧版本尚未保留(例如,在升级时)。
请注意,您还可以为其他类型编写自己的可视化工具,更多信息here和here。这是复杂项目的主要节省时间,非常值得(小)努力编写自定义可视化工具。
答案 2 :(得分:1)
是的,我在我的调试器中看到了这个问题,在我的情况下
答案 3 :(得分:1)
一个想法 - std :: string的STLPort实现使用分割缓冲区实现。它有一个小的静态缓冲区(我想说14个字符)和一个指向char数组的指针。其中一个将无效,另一个将包含字符串数据,具体取决于存储的字符串的长度。如果你正在使用STLPort或类似的实现,你的字符串可视化工具可能正在查看错误的缓冲区,它恰好包含垃圾数据。
答案 4 :(得分:1)
我相信Aardvark可能正确答案。如果我在编译混合模式时记得正确,编译器会将尽可能多的C ++代码转换为在CLR上运行的代码,从而转换为CLR所拥有的内存。我的geuss是调试器对字符串的保存位置感到困惑 - 非托管或托管内存。
答案 5 :(得分:0)
这是一个永久存在于Visual Studio调试器中的错误,至今仍在Visual Studio 2019中发生。
这是随机的。
有时候更改代码并重新编译可以解决问题,有时却不能解决。