VS 2012调试器 - 具有\\转义序列的字符串文字的不同显示

时间:2014-10-14 11:40:17

标签: debugging visual-studio-2012 mixed-mode

我有一个包含C ++和C#代码的混合模式项目。字符集是UNICODE。以下字符串文字在C ++代码中的某处定义。

 LPCTSTR lpctszRegKey = _T( "SOFTWARE\\MICROSOFT\\KEYBOARD\\");
  1. 当我选择" Native Only"作为“本地Windows调试器”,以下内容显示在“监视”窗口中。

    lpctszRegKey    0x01054134 L"SOFTWARE\\MICROSOFT\\KEYBOARD\\"   const wchar_t *
    
  2. 当我选择"混合"作为“本地Windows调试器”,以下内容显示在“监视”窗口中。

    lpctszRegKey    0x00274134 "SOFTWARE\MICROSOFT\KEYBOARD\"   const wchar_t *
    
  3. 请注意,在第一种情况下,它显示双反斜杠(即\\),在第二种情况下,它只显示在字符串文字之间的单反斜杠(即\)。

    如何在" Native Only"的情况下显示转义序列\调试器而不是"混合"调试器?

1 个答案:

答案 0 :(得分:3)

调试器努力在语法中显示与用于编写程序的语言相匹配的字符串。当然,字符串确实没有双反斜杠,你可以从文本可视化工具(点击间谍玻璃图标)或内存视图(Debug + Windows + Memory + Memory 1)中看到。< / p>

要做到这一点,它当然需要知道编写程序的语言。这比看起来要难得多,可执行文件中没有允许它正确猜测的元数据。也不包括在PDB文件中。它采用了明显的方法,它根据正在调试的项目的类型进行格式化。因此,C#或C ++程序员总是看到双反斜杠,VB.NET程序员不会,因为该语言对字符串文字有不同的规则。

当您将调试器类型更改为混合时,您将获得两个调试引擎,一个用于本机代码,另一个用于托管代码。现在源语言选择变得非常模糊,调试器知道的所有代码都是不是用C或C ++编写的代码。但无论如何,无论哪种语言编译器生成它,.NET程序集看起来都是一样的。也不能说出哪一个更“重要”。

被迫猜测它会猜错的重要几率,当你无法做出正确的选择时,这是合乎逻辑的。你让每个人都同样不高兴。您可以看到字符串的原样,它在文本可视化工具中的显示方式,没有任何转义。