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

Отладка .NET-кода с MS Symbol Server - VS не отображает значения переменных

Когда я отлаживаю свой код веб-сайта ASP.NET с помощью символа отладки Microsoft для .NET. Я продолжаю получать этот глупый "результат" для большинства переменных, когда я отлаживаю .NET-код .NET(что, конечно же, предоставленный сервером Symbol Microsoft, который я сказал VS2008, чтобы захватить информацию, from)

Cannot obtain value of local or argument 'cookie' as 
it is not available at this instruction pointer, possibly because 
it has been optimized away.

Он, как и код, который я использую, использует оптимизированный, скомпилированный код. Если это так, могу ли я сказать ему НЕ оптимизировать? Я в конфигурации DEBUG. Это очень неприятно, потому что я не могу отлаживать.. потому что я не вижу/извлекаю значения локальных переменных при прохождении кода.

Любые подсказки/мысли?

4b9b3361

Ответ 1

Шон Берк описал способ отключения этого на blog.

Сначала создайте CMD, который загрузит Visual Studio без оптимизации JIT.

set COMPLUS_ZapDisable=1
cd /d "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\ide\"
start devenv.exe
exit

В проекте Visual Studio выполните следующие действия:

1) Щелкните правой кнопкой мыши файл проекта и выберите "Свойства"

2) Выберите вкладку "Отладка" и снимите флажок "Включить процесс хостинга Visual Studio"

3) Запустите приложение в отладчике.

Ответ 2

Для обычного приложения .Net вы можете отключить использование оптимизаций JIT с .INI файлом рядом с стартовым двоичным кодом. Здесь ссылка на то, как это достигается

http://blogs.msdn.com/jaredpar/archive/2008/08/29/disabling-jit-optimizations-while-debugging.aspx

Отладка ASP.Net немного отличается, и я не уверен, что это сработает для вас. Если вы отлаживаете локально с помощью легкого веб-сервера (cassini), вы можете применить этот трюк к самому Кассини. Если вы отлаживаете прямо на веб-сервере, хотя внутри IIS я не знаю, как заставить этот трюк работать, но, надеюсь, он приведет вас в правильном направлении.

Ответ 3

После многих исследований мне удалось найти способ сделать эту технику "COMPLUS_ZapDisable" работать при подключении к приложению, работающему под IIS, в IIS7/Windows 7 x64.

В моем случае я использую символы, построенные Reflector Pro, хотя я предполагаю, что он также будет работать для символов Microsoft, о которых спрашивал OP.

Фокус в том, чтобы найти нужное место для установки этой переменной среды, чтобы ваш w3wp.exe запускался с включенным параметром. Для этого добавьте строковый ключ "COMPLUS_ZAPDISABLE" в ваш реестр в "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment". Установите значение ключа на "1", и это должно сделать трюк. Не делайте этого при производстве =)

Престижность Clive Tong, автора этого сообщения от Red Gate, для указания меня в правильном направлении.

Ответ 4

Код платформы .NET оптимизирован, поэтому вы не сможете просматривать все переменные, поскольку они, вероятно, не существуют в оптимизированном коде. Я предполагаю, что вы пытаетесь отлаживаться внутри самой платформы .NET. Ничего особенного вы не можете сделать с этим досадно.

Ответ 5

Наконец, это решение сработало для меня при подключении к aspnet_wp.exe Visual Studio 2008,.NET framework 2.0: перейдите в свойства проекта, на вкладку Build, кнопка Advanced → установите Output Debug Info в "full". Надеюсь, это поможет кому-то.