Проблемы с отладкой командлета PowerShell

Я использую Visual Studio 2010 для 64-разрядной версии Windows 7. У меня возникла проблема с отладкой специального командлета PowerShell.

Конфигурация

  • Язык: С#, предназначенный для .NET Framework 3.5 SP1.
  • Цель платформы: любой процессор
  • Начало действия: C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
  • Аргументы командной строки: -noexit -command Add-PSSnapIn MyCustomSnapIn

Проблема 1: Не удалось подключиться, когда я нажимаю F5 (Debug → Start Debugging)

  • PowerShell открывается, а диспетчер задач указывает, что powershell.exe работает как 64-разрядный процесс. В столбце "Имя пути к изображению" показан тот же исполняемый файл, который указан в действии "Пуск".
  • Если я выберу Debug → Перерыв Все в Visual Studio, я получаю сообщение "Невозможно разорвать выполнение. Этот процесс в настоящее время не выполняет тип кода, который вы выбрали для отладки".

Проблема 2: Неожиданно запускается как 32-разрядный процесс, когда я нажимаю Ctrl + F5 (Debug → Start Without Debugging)

  • Откроется PowerShell. Диспетчер задач указывает, что powershell.exe работает как 32-битный процесс - на этот раз имя пути изображения отображает перенаправление SysWOW64.

Досадный способ отладки прямо сейчас: Единственный способ, которым я нашел отладку моего командлета, - нажать F5, затем выбрать Debug → Отсоединить все, затем выбрать Debug → Прикрепить к процессу и снова подключиться Visual Studio.

Ответ 1

Проблема 1:

Мне кажется, что ошибка в VS2010 представлена ​​здесь: https://connect.microsoft.com/VisualStudio/feedback/details/539389/debugging-powershell-cmdlet-from-vs-2010-does-not-stop-at-breakpoints?wa=wsignin1.0

Использование VS2008 должно помочь.

Обновление: Я нашел более удобный способ отладки командлетов powershell. В редакторе решений щелкните правой кнопкой мыши по решению node → Добавить → Новый проект → Выберите файл powershell.exe(C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe). Установите новый добавленный проект в качестве запуска проекта (щелкните правой кнопкой мыши и выберите "Установить как проект запуска" ). Затем перейдите к свойствам проекта (щелкните правой кнопкой мыши по проекту node и выберите "Свойства" ) и установите для свойства "Тип отладчика" значение "Управляемый (v2.0, v1.1, v1.0)". Не забудьте зарегистрировать своего провайдера или CmdLet (запустив события пост-сборки, см. http://msdn.microsoft.com/en-us/library/ms714644%28v=vs.85%29.aspx). Теперь программа должна остановиться в точке останова.

Ответ 2

В задаче № 2, поскольку Visual Studio - это 32-разрядный процесс, запущенный на WOW64, путь C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe перенаправляется на C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe. Вот где живет 32-разрядная версия PowerShell.

Ответ 3

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

Я обнаружил, что для PowerShell 2.0 для меня работает следующий сценарий. Я также использую VS2010 SP1 в 64-разрядной версии Windows 7.

С PS 2.0 вам не нужно устанавливать командлеты с помощью installutil. Вместо этого вместо этого вы можете использовать Import-Module (для которого не требуется права администратора). Я не буду вдаваться в подробности о том, как это делается как веб-поиск, и выявит большинство деталей, но, в общем, вам нужно будет создать папку (если она еще не существует):

md (Join-Path (Split-Path $profile) modules)

В папке с модулями создайте другую папку с тем же именем, что и DLL командной строки (минус ".DLL" ). Эта папка будет содержать ваш двоичный файл и файл psd1, который описывает вашу DLL (см. Манифест модуля > ). Для моего удобства я создал эту папку в виде символической ссылки папки в папку bin\debug проектов.

Вам все равно нужно запустить PowerShell (или PowerShell ISE) из Visual Studio, как описано в другом разделе "Начало действия" на вкладке "Отладка" свойств проекта.

Установите точки останова и идите. После запуска PowerShell введите:

Import-Module <ModuleName>

Затем запустите ваш командлет.


Пример

C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.dll 
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.pdb
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.psd1
C:\Users\<me>\Documents\WindowsPowerShell\modules\MyCmdlet\MyCmdlet.Types.ps1xml (etc.)

В типе PowerShell (также может быть помещен в ваш профиль):

Import-Module MyCmdlet

Для меня это касается всех моих контрольных точек, а также останавливается на исключениях. Все без необходимости прикреплять к процессу и т.д.

Ответ 4

Проблема 1: powershell.exe на самом деле не управляемый исполняемый файл. В нем размещается сама среда CLR, поэтому вам необходимо включить встроенную отладку кода вместе с управляемым для этого.

Что касается проблемы 2, я не уверен в этом. Очевидно, что сам VS является 32-битным процессом, поэтому, возможно, он вмешивается здесь.

Ответ 5

Мне удалось решить проблему №2, создав папку C:\dev\PowerShell\x64 и скопировав все из C:\Windows\System32\WindowsPowerShell\v1.0 в нее. Я создал аналогичную папку C:\dev\PowerShell\x86. Предполагаемая версия PowerShell всегда запускается, когда я укажу эти пути, поэтому самый короткий способ начать отладку - это "Начать без отладки", а затем "Присоединить к процессу".

Ответ 6

Вы не упомянули, как вы устанавливаете плагин перед вызовом Add-PSSnapin, чтобы сделать его пригодным для использования в сеансе отладки.

Убедитесь, что вы устанавливаете плагин с помощью C:\Windows\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe, а не тот, который находится в... \Framework... - это заставило меня за пару дней.

Ответ 7

У меня была эта проблема с VS2010, но она ушла после установки SP1.