Debugging VS 2012调试器-具有\\转义序列的字符串文本的不同显示 我有一个混合模式项目,它包含C++和C代码。字符集是UNICODE。下面的字符串文字是在C++代码中定义的。 LPCTSTR lpctszRegKey = _T( "SOFTWARE\\MICROSOFT\\KEYBOARD\\");

Debugging VS 2012调试器-具有\\转义序列的字符串文本的不同显示 我有一个混合模式项目,它包含C++和C代码。字符集是UNICODE。下面的字符串文字是在C++代码中定义的。 LPCTSTR lpctszRegKey = _T( "SOFTWARE\\MICROSOFT\\KEYBOARD\\");,debugging,visual-studio-2012,mixed-mode,Debugging,Visual Studio 2012,Mixed Mode,当我选择纯本机作为“本地Windows调试器”时,监视窗口中将显示以下内容 lpctszRegKey 0x01054134 L"SOFTWARE\\MICROSOFT\\KEYBOARD\\" const wchar_t * lpctszRegKey 0x00274134 "SOFTWARE\MICROSOFT\KEYBOARD\" const wchar_t * 当我选择Mixed作为“本地Windows调试器”时,监视窗口中将显示以下内容 lpctszRegKey

当我选择纯本机作为“本地Windows调试器”时,监视窗口中将显示以下内容

lpctszRegKey    0x01054134 L"SOFTWARE\\MICROSOFT\\KEYBOARD\\"   const wchar_t *
lpctszRegKey    0x00274134 "SOFTWARE\MICROSOFT\KEYBOARD\"   const wchar_t *
当我选择Mixed作为“本地Windows调试器”时,监视窗口中将显示以下内容

lpctszRegKey    0x01054134 L"SOFTWARE\\MICROSOFT\\KEYBOARD\\"   const wchar_t *
lpctszRegKey    0x00274134 "SOFTWARE\MICROSOFT\KEYBOARD\"   const wchar_t *
请注意,在第一种情况下,它显示双反斜杠,即\\,而在第二种情况下,它仅显示单反斜杠,即\,它们出现在字符串文字之间


为什么转义序列\在纯本机调试器的情况下显示,而在混合调试器的情况下不显示?

调试器努力以与用于编写程序的语言匹配的语法显示字符串。当然,字符串实际上没有双反斜杠,您可以从文本可视化工具单击spy glass图标或内存视图Debug+Windows+memory+memory 1中看到这一点

要使其工作,它当然需要知道程序所用的语言。这比看起来要困难得多,因为可执行文件中没有元数据允许它正确猜测。也不包括在PDB文件中。这是一种显而易见的方法,它根据正在调试的项目类型进行格式化。因此,C或C++程序员总是看到双反斜杠,VB.NET程序员不这样做,因为该语言对字符串文字有非常不同的规则。 当您将调试器类型更改为mixed时,您将获得两个调试引擎,一个用于本机代码,另一个用于托管代码。现在源语言的选择变得非常模糊,调试器知道的所有代码都不是用C或C++编写的。但无法分辨哪个.NET程序集,无论编译器生成它的是什么语言,它看起来都是一样的。它也不知道哪一个更重要


当你无法做出正确的选择时,如果你被迫猜错的几率很大,那么它就会做合乎逻辑的事情。你让每个人都同样不快乐。您可以看到字符串的原样,即它在文本可视化工具中的显示方式,没有任何转义。

感谢您的详细解释。正如您所说,这两种情况下的内存表示是相同的。据观察,该问题不影响其他转义序列,如\?,\,请参见下面修改的定义及其结果。LPCTSTR lpctszRegKey=\u T软件\\MICROSOFT\?键盘\';仅本机lpctszRegKey=0x00944134 LSOFFTWARE\\MICROSOFT?键盘“混合lpctszRegKey=0x008a4134 SOFTWARE\MICROSOFT?键盘”在这两种情况下,转义序列不显示反斜杠?和“似乎问题出在\\转义序列上。同样的事情。”?不是有效的转义序列。