5

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

替代文字 http://img175.imageshack.us/img175/3561/43419953av1.jpg

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

这也发生在你身上吗?

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

4

6 回答 6

1

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

于 2010-01-08T05:15:21.140 回答
1

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

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

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

糟糕的调用堆栈也会导致类似的问题。确保堆栈没有任何条目,例如“堆栈对于这一点可能不正确......”。可以?

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

于 2009-02-12T15:59:39.657 回答
1

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

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

于 2009-02-12T16:18:01.950 回答
1

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

于 2009-02-12T16:24:55.257 回答
1

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

于 2009-05-21T03:36:24.663 回答
0

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

这是随机的。

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

于 2020-04-17T09:55:44.170 回答