Подтвердить что ты не робот

Visual Studio Debugger - любой способ получить доступ к генерируемым компилятором временным переменным через отладчик?

Если вы просмотрите код С# в Reflector, вы можете заметить специальные локальные переменные, созданные компилятором, которые называются шаблоном CS $X $Y. Эти переменные были (неофициально) задокументированы в этом ответе.

Есть ли способ просмотреть эти значения через окно "Смотреть" в Visual Studio или через API расширяемости VS Debugger?

Я спрашиваю конкретно о регулярном отладчике Visual Studio, пожалуйста, не отвечайте, что это возможно через windbg/sos/sosex - поскольку это не то, что я ищу.

4b9b3361

Ответ 1

К сожалению, нет способа сделать это с С# EE. Имена этих локальных жителей действительно хранятся в PDB и доступны. Однако С# EE будет отфильтровывать все временные значения во время отладки, чтобы уменьшить беспорядок. Эта фильтрация безусловна и не может быть переопределена. С# здесь не один, так как это поведение на каждом языке.

Хорошей новостью является то, что каждый язык использует разные шаблоны именования для своих временных рядов. Это означает, что временное имя в С# будет работать прямо после фильтрации VB EE. Несмотря на то, что это незаконный идентификатор, VB EE по-прежнему считает его действительным локальным (и наоборот). Следовательно, вам просто нужно временно переключить механизм отладки для кода С# на VB EE, и локальные жители станут видимыми.

Вот как это сделать

  • Закройте все экземпляры Visual Studio (это действительно важно)
  • Открыть regedit
  • Перейдите к HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0_Config\AD7Metrics\ExpressionEvaluator\{3F5162F8-07C6-11D3-9053-00C04FA302A1}\{994B45C4-E6E9-11D2-903F-00C04FA302A1}
  • Измените значение CLSID с {60F5556F-7EBC-4992-8E83-E9B49187FDE3} на {59924502-559A-4BB1-B995-5D511BB218CD}

Теперь, когда вы отлаживаете код С#, он будет использовать VB EE и, следовательно, отображать временные ряды как обычные локальные жители. Обратите внимание, что это полностью не поддерживается. Но он должен работать нормально. Я смог увидеть исходные значения закрытия с помощью этой трюки на своей машине и немного пошутить без каких-либо проблем.

Обратите внимание, что эти инструкции относятся к Visual Studio 2013. Если вы используете 2012 или 2010, это должно сработать, изменив 12.0_Config в имени ключа реестра на

  • 2012 use 11.0_Config
  • 2010 use 10.0_Config

Может потребоваться несколько настроек поверх этого (на самом деле не тестировались более старые версии). Если у вас возникнут какие-либо проблемы, сообщите мне об этом, и я попытаюсь заставить его работать локально и обновить инструкции.

Вот итог финального вывода после внесения этого изменения

enter image description here

Ответ 2

Нет, они не добавляются в файл PDB. Отладчик просто не имеет возможности их обнаружить и не знает ничего о том, где они хранятся. Это все намеренно.