Tuesday, September 17, 2013

Удаленная отладка C# и mixed приложений в Visual Studio 2005 - 2012

При удаленной отладке C++ приложений, я обычно использую режим без аутентификации, отключаю UAC и файерволл и не знаю горя, при отладке C# приложений в Visual Studio 2005 - 2010 все выглядит несколько сложнее. Ниже я хочу описать процесс подготовки к отладке C# и mixed приложений в Visual Studio, включая заметки по отладке в Visual Studio 2012. Эти же действия могут быть применимы для удаленной отладки C++ приложений.

Далее предполагается распространенная ситуация для разработчика под Windows - машина с Visual Studio 2005-2012, входящая в домен, и тестовая машина (вероятнее всего виртуальная) в рабочей группе.

Чтобы не мучиться с разрешениями для доступа, нужно отключить на удаленной машине User Account Control (UAC) и файерволл, иначе могут потребоваться дополнительные настройки.

На удаленной машине нужно создать двух пользователей: первого - с тем же логином/паролем, что и ваша доменная учетная запись, вторую назовем debugger с произвольным паролем. Обе учетные записи нужно добавить в группу локальных администраторов. На локальной машине, с которой будет производится отладка и где установлена Visual Studio, нужно создать пользователя debugger с тем же паролем, что и на удаленной машине.

Можно также обойтись одним пользователем debugger, но тогда нужно запускать Visual Studio от пользователя debugger:
runas /user:debugger "C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe"

Скопировать на удаленную машину папку x86 (или x64 для отладки 64-битных приложений) из директории Remote Debugger, которую можно найти в той папке, куда установлена студия (например, c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\Remote Debugger\). Запустить отладчик командой:
runas /user:debugger msvsmon.exe
После запуска отладчика в меню Permissions добавить учетную запись, одноименную с вашей доменной, в список разрешенных для удаленной отладки.

Теперь можно запустить отлаживаемое приложение и подключиться к нему из студии (меню Debug > Attach to Process...). В появившемся окне нужно выбрать в списке Transport = Default, ниже ввести debugger@remote_machine_name. В поле Attach to выбрать Managed и Native code (в студии есть баг или фича, что без явного выбора в режиме Avto отлаживать mixed-applications не получится). В списке процессов нужно выбрать свое приложение и поставить точки останова.

Есть также возможность удаленного запуска отлаживаемого приложения. Для этого нужно открыть свойства проекта и в группе Debugging ввести параметры подключения, путь до приложения, параметры и т.д. После этого нужно просто запустить отладку и приложение будет запущено на удаленной машине.

Отлаживать удаленно можно только компоненты, собранные в конфигурации Release, потому что Debug использует runtime библиотеки, недоступные на удаленной машине. Перед отладкой нужно сконфигурировать проект включив генерацию Debug info (.pdb файлов) и отключив оптимизацию. Без отладочных символов (.pdb) можно отлаживать только дизассемблированый код, а благодаря .pdb можно будет видеть соответствующие строки кода и состояния переменных. Оптимизацию отключаем для того, чтобы состояния переменных показывались правильно, иначе вместо реальных значений можно увидеть мусор.

Для отладки C# компонент на удаленную машину в папку с соответствующим отлаживаемым бинарником нужно скопировать .pdb файлы, а для отладки C++ копировать их не нужно, студия будет искать их локально.

Если при попытке приаттачиться к удаленному процессу появляется сообщение об ошибке

Unable to attach to the process
с указанием
The application you are trying to debug uses a version of the Microsoft .Net Framework that is not supported by the debugger ...

Нужно открыть на удаленном сервере конфигурационный файл приложения .exe.config, который лежит в той же папке, что и само приложение и закомментировать строку supportedRuntime, в моем случае


<configuration>
  <startup uselegacyv2runtimeactivationpolicy="true">
    <!--supportedRuntime version="v4.0"/-->
    <supportedruntime version="v2.0.50727">
    </supportedruntime>
  </startup>
</configuration>

Дополнительная информация о причине ошибке и другой вариант ее исправления http://msdn.microsoft.com/en-us/library/ms241897.aspx

Замечания для Visual Studio 2012

В случае Visual Studio 2012 простое копирование на удаленный сервер папки с удаленным отладчиком не подойдет, он работать не будет. Нужно скачать установочный пакет Remoting Tools (http://www.microsoft.com/en-us/download/details.aspx?id=38184), установить и настроить на запуск в качестве службы или вручную запускаемого приложения.

Visual Studio 2012 для C# поддерживает подключение к удаленному отладчику в режиме Remote (no authentication), как это можно сделать для отладки C++ приложения.

Подробнее об удаленной отладке в Visual Studio 2012 см. http://msdn.microsoft.com/en-us/library/vstudio/y7f5zaaa.aspx

No comments: