Compartir a través de


Uso de Visual Studio Code para depurar cmdlets compilados

En esta guía se muestra cómo depurar de forma interactiva el código fuente de C# para un módulo de PowerShell compilado mediante Visual Studio Code (VS Code) y la extensión de C#.

Se asume cierta familiaridad con el depurador de Visual Studio Code.

En esta guía se da por hecho que ha leído y seguido las instrucciones de la guía Escritura de módulos portables.

Creación de una tarea de compilación

Compile el proyecto automáticamente antes de iniciar una sesión de depuración. La recompilación garantiza que se depura la versión más reciente del código.

Configure una tarea de compilación:

  1. En la Paleta de comandos, ejecute el comando Configure Default Build Task.

    Ejecución del comando Configure Default Build Task

  2. En el cuadro de diálogo Seleccionar una tarea para configurar, elija la opción Crear un archivo tasks.json a partir de la plantilla.

  3. En el cuadro de diálogo Select a Task Template (Seleccionar una plantilla de tarea), elija .NET Core.

Se crea un nuevo archivo tasks.json si aún no existe uno.

Para probar la tarea de compilación:

  1. En la Paleta de comandos, ejecute el comando Run Build Task.

  2. En el cuadro de diálogo Select the build task to run (Seleccionar la tarea de compilación para ejecutar), elija Compilar.

Información sobre los archivos DLL que se bloquean

De forma predeterminada, una compilación correcta no muestra la salida en el panel de terminal. Si ve una salida que contiene el texto El archivo del proyecto no existe, debe editar el archivo de tasks.json. Incluya la ruta de acceso explícita al proyecto de C# expresado como "${workspaceFolder}/myModule". En este ejemplo, myModule es el nombre de la carpeta del proyecto. Esta entrada debe ir después de la entrada build en la lista de args de la siguiente manera:

    {
        "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"
    }

Al depurar, el archivo DLL del módulo se importa en la sesión de PowerShell en el terminal de VS Code. El archivo DLL se bloquea. El mensaje siguiente se muestra al ejecutar la tarea de compilación sin cerrar la sesión de terminal:

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

Las sesiones del terminal deben cerrarse antes de recompilar.

Configuración del depurador

Para depurar el cmdlet de PowerShell, debe configurar una configuración de inicio personalizada. Esta configuración se usa para:

  • Compilación del código fuente
  • Inicio de PowerShell con el módulo cargado
  • Deje PowerShell abierto en el panel de terminales.

Al invocar el cmdlet en la sesión de terminal, el depurador se detiene en cualquier punto de interrupción establecido en el código fuente.

Configuración de launch.json para PowerShell

  1. Instala la extensión C# para Visual Studio Code

  2. En el panel Depurar, agregue una configuración de depuración.

  3. En el cuadro de diálogo Select environment, elija .NET Core

  4. El archivo launch.json se abre en el editor. Con tu cursor dentro de la matriz configurations, ves el selector configuration. Si no ve esta lista, seleccione Agregar configuración.

  5. Para crear una configuración de depuración predeterminada, seleccione Launch .NET Core Console App (Iniciar la aplicación de consola de .NET Core):

    Iniciar la aplicación de consola de .NET Core

  6. Edite los campos name, program, argsy console como se indica a continuación:

     {
         "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"
     }
    

El campo program se usa para iniciar pwsh, de modo que se pueda ejecutar el cmdlet que se está depurando. El argumento -NoExit impide que la sesión de PowerShell salga tan pronto como se importe el módulo. La ruta de acceso del argumento Import-Module es la ruta de acceso de salida de la compilación predeterminada cuando se ha seguido la guía Escritura de módulos portables. Si se ha creado un manifiesto de módulo (archivo .psd1), debe usar en su lugar la ruta de acceso a este. El separador de ruta de acceso / funciona en Windows, Linux y macOS. Debe usar el terminal integrado para ejecutar los comandos de PowerShell que se quieren depurar.

Nota

Si el depurador no se detiene en ningún punto de interrupción, busque en la Consola de depuración de Visual Studio Code para ver una línea que indica:

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

Si ve esto, agregue "justMyCode": false a la configuración de inicio (en el mismo nivel que "console": "integratedTerminal".

Configuración de launch.json para Windows PowerShell

Esta configuración de inicio funciona para probar los cmdlets en Windows PowerShell (powershell.exe). Cree una segunda configuración de inicio con los siguientes cambios:

  1. name debe ser PowerShell cmdlets: powershell

  2. type debe ser clr

  3. program debe ser powershell

    Debería tener este aspecto:

     {
         "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"
     }
    

Inicio de una sesión de depuración

Ahora todo está listo para comenzar la depuración.

Puede recorrer el código fuente, inspeccionar variables e inspeccionar la pila de llamadas.

Para finalizar la depuración, haga clic en Detener en la barra de herramientas Depurar o pulse Mayús+F5. El shell que se usa para la depuración se cierra y libera el bloqueo en el archivo DLL compilado.