Использование Visual Studio Code для отладки скомпилированных командлетов

В этом руководстве показано, как интерактивно отлаживать исходный код C# для скомпилированного модуля PowerShell с помощью Visual Studio Code (VS Code) и расширения C#.

Предполагается, что уже имеются определённые знания об отладчике Visual Studio Code.

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

Создание задачи сборки

Создайте проект автоматически перед запуском сеанса отладки. Перестроение гарантирует отладку вашей последней версии кода.

Настройка задачи сборки:

  1. В палитре команд выполните команду Настроить задачу сборки по умолчанию.

    выполнить настройку задачи сборки по умолчанию

  2. В диалоговом окне Выберите задачу для настройки, выберите Создать файл tasks.json из шаблона.

  3. В диалоговом окне Выбор шаблона задачи выберите .NET Core.

Новый файл tasks.json создается, если он еще не существует.

Чтобы протестировать задачу сборки, выполните приведенные далее действия.

  1. В палитры командвыполните команду задачи сборки.

  2. В диалоговом окне Выберите задачу сборки для запуска выберите сборку.

Сведения о заблокированных файлах DLL

По умолчанию успешная сборка не отображает выходные данные в области терминала. Если вы видите выходные данные, содержащие текст Project file doesn't exist, вам следует отредактировать файл tasks.json. Включите явный путь к проекту C#, выраженному как "${workspaceFolder}/myModule". В этом примере myModule — это имя папки проекта. Эта запись должна быть расположена после элемента build в списке args следующим образом:

    {
        "label": "build",
        "command": "dotnet",
        "type": "shell",
        "args": [
            "build",
            "${workspaceFolder}/myModule",
            // Ask dotnet build to generate full paths for file names.
            "/property:GenerateFullPaths=true",
            // Do not generate summary otherwise it leads to duplicate errors in Problems panel
            "/consoleloggerparameters:NoSummary",
        ],
        "group": "build",
        "presentation": {
            "reveal": "silent"
        },
        "problemMatcher": "$msCompile"
    }

При отладке библиотека DLL модуля импортируется в сеанс PowerShell в терминале VS Code. Библиотека DLL заблокирована. Следующее сообщение отображается при запуске задачи сборки без закрытия сеанса терминала:

Could not copy "obj\Debug\netstandard2.0\myModule.dll" to "bin\Debug\netstandard2.0\myModule.dll"`.

Перед перестройкой сеансы терминала должны быть закрыты.

Настройка отладчика

Чтобы выполнить отладку командлета PowerShell, необходимо настроить настраиваемую конфигурацию запуска. Эта конфигурация используется для:

  • Создание исходного кода
  • Запуск PowerShell с загруженным модулем
  • Оставьте PowerShell открытым в области терминала

При вызове командлета в сеансе терминала отладчик останавливается на любой точке останова, заданной в вашем исходном коде.

Настройка launch.json для PowerShell

  1. Установка расширения C# для Visual Studio Code

  2. В области отладки добавьте конфигурацию отладки

  3. В диалоговом окне Select environment выберите .NET Core

  4. Файл launch.json открыт в редакторе. Когда ваш курсор находится внутри массива configurations, вы видите средство выбора configuration. Если этот список не отображается, выберите Добавить конфигурацию.

  5. Чтобы создать конфигурацию отладки по умолчанию, выберите Запустить консольное приложение .NET Core:

    запустить консольное приложение .NET Core

  6. Измените поля name, program, argsи console следующим образом:

     {
         "name": "PowerShell cmdlets: pwsh",
         "type": "coreclr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "pwsh",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

Поле program используется для запуска pwsh, чтобы выполнить отлаживаемый командлет. Аргумент -NoExit предотвращает выход сеанса PowerShell сразу после импорта модуля. Путь в аргументе Import-Module — это путь вывода сборки по умолчанию, следуя руководству по написанию переносимых модулей. Если вы создали манифест модуля (.psd1 файл), следует использовать путь к нему. Разделитель путей / работает в Windows, Linux и macOS. Для отладки команд PowerShell необходимо использовать интегрированный терминал.

Заметка

Если отладчик не останавливается на точках останова, просмотрите строку в консоли отладки Visual Studio Code:

Loaded '/path/to/myModule.dll'. Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

Если вы видите это, добавьте "justMyCode": false в конфигурацию запуска (на том же уровне, что и "console": "integratedTerminal".

Настройка launch.json для Windows PowerShell

Конфигурация этого запуска подходит для тестирования ваших командлетов в Windows PowerShell (powershell.exe). Создайте вторую конфигурацию запуска со следующими изменениями:

  1. name должно быть PowerShell cmdlets: powershell

  2. type должно быть clr

  3. program должно быть powershell

    Это должно выглядеть следующим образом:

     {
         "name": "PowerShell cmdlets: powershell",
         "type": "clr",
         "request": "launch",
         "preLaunchTask": "build",
         "program": "powershell",
         "args": [
             "-NoExit",
             "-NoProfile",
             "-Command",
             "Import-Module ${workspaceFolder}/myModule/bin/Debug/netstandard2.0/myModule.dll",
         ],
         "cwd": "${workspaceFolder}",
         "stopAtEntry": false,
         "console": "integratedTerminal"
     }
    

Запуск сеанса отладки

Теперь все готово к отладке.

Вы можете выполнить шаги по исходному коду, проверить переменные и проверить стек вызовов.

Чтобы завершить отладку, нажмите кнопку Остановить на панели инструментов отладки или нажмите клавиши SHIFT+F5. Оболочка, используемая для отладки, завершает работу и освобождает блокировку скомпилированного DLL-файла.