Herramientas para depurar procesos y subprocesos en Visual Studio

Subprocesos y procesos son conceptos relacionados en informática. Los dos representan secuencias de instrucciones que se deben ejecutar en un orden concreto. Sin embargo, las instrucciones de subprocesos o procesos independientes se pueden ejecutar en paralelo.

Los procesos existen en el sistema operativo y corresponden a lo que los usuarios consideran programas o aplicaciones. Por otra parte, un subproceso existe dentro de un proceso. Por esta razón, los subprocesos se denominan a veces procesos ligeros. Cada proceso está compuesto por uno o más subprocesos.

La existencia de varios procesos permite a un equipo realizar más de una tarea a la vez. La existencia de varios subprocesos permite a un proceso dividir el trabajo que se va a realizar en paralelo. En un equipo con multiprocesadores, los procesos o subprocesos se pueden ejecutar en procesadores diferentes. Esto permite realizar un verdadero procesamiento en paralelo.

El procesamiento paralelo perfecto no siempre es posible. En ocasiones, los subprocesos deben sincronizarse. Es posible que un subproceso tenga que esperar al resultado de otro subproceso, o necesite acceso exclusivo a un recurso que otro subproceso esté utilizando. Los problemas de sincronización son una causa común de errores en las aplicaciones multiproceso. A veces, los subprocesos pueden acabar esperando un recurso que nunca está disponible. Esto provoca una condición denominada interbloqueo.

El depurador de Visual Studio proporciona herramientas eficaces pero fáciles de usar para depurar subprocesos y procesos.

Herramientas y características

Las herramientas que necesita usar en Visual Studio dependen del tipo de código que esté intentando depurar:

  • En el caso de los procesos, las herramientas principales son el cuadro de diálogo Asociar al proceso, la ventana Procesos y la barra de herramientas Ubicación de depuración.

  • En el caso de los subprocesos, las herramientas principales para depurar subprocesos son la ventana Subprocesos, los marcadores de subprocesos en ventanas de código fuente, la ventana Pilas paralelas, la ventana Inspección paralela y la barra de herramientas Ubicación de depuración.

  • En el caso del código que usa la Task de la Biblioteca de procesamiento paralelo basado en tareas (TPL), el Runtime de simultaneidad (código nativo), las herramientas principales para depurar aplicaciones multiproceso son la ventana Pilas paralelas, la ventana Inspección paralela y la ventana Tareas (la ventana Tareas también admite el objeto Promise de JavaScript).

  • Para depurar subprocesos en la GPU, la herramienta principal es la ventana Subprocesos de GPU.

    La tabla siguiente muestra la información disponible y las acciones que se pueden realizar en cada uno de estos lugares:

Interfaz de usuario Información disponible Acciones que puede realizar
Cuadro de diálogo Asociar al proceso Procesos disponibles que puede asociar:

- Nombre del proceso (.exe)
- Número de id. del proceso
- Título de la barra de menú
- Tipo (Administrado v4.0; Administrador v2.0, v1.1, v1.0; x86; x64; IA64)
- Nombre de usuario (nombre de la cuenta)
- Número de la sesión
Seleccionar un proceso para asociar

Seleccionar un equipo remoto

Cambiar el tipo de transporte para conectar a equipos remotos.
Ventana Procesos Procesos asociados:

- Nombre del proceso
- Número de id. del proceso
- Ruta de acceso al archivo .exe del proceso
- Título de la barra de menú
- Estado (Interrumpir. En ejecución)
- Depuración (nativa, administrada, etc.)
- Tipo de transporte (predeterminado, nativo sin autenticación)
- Calificador de transporte (equipo remoto)
Herramientas:

- Adjuntar
- Desasociar
- Terminar

Menú contextual:

- Adjuntar
- Desasociar
- Desasociar cuando se interrumpa la depuración
- Terminar
Ventana Subprocesos Subprocesos en el proceso actual:

- Id. de subproceso
- Identificador administrado
- Categoría (subproceso principal, subproceso de interfaz, controlador de llamadas a procedimientos remotos o subproceso de trabajo)
- Nombre del subproceso
- Ubicación donde se creó el subproceso
- Prioridad
- Máscara de afinidad
- Número de suspendidos
- Nombre del proceso
- Indicador de marca
- Indicador de suspendido
Herramientas:

- Buscar
- Buscar en pila de llamadas
- Marcar Solo mi código
- Marcar selección de módulos personalizados
- Agrupar por
- Columnas
- Expandir o contraer pilas de llamadas
- Expandir o contraer grupos
- Inmovilizar o reanudar subprocesos

Menú contextual:

- Mostrar subprocesos en código fuente
- Cambiar a un subproceso
- Inmovilizar un subproceso en ejecución
- Reanudar un subproceso inmovilizado
- Marcar un subproceso para su estudio adicional
- Quitar el marcador a un subproceso
- Cambiar el nombre de un subproceso
- Mostrar y ocultar subprocesos

Otras acciones:

- Ver la pila de llamadas de un subproceso en una información sobre datos
Ventana de código fuente Los indicadores de subproceso del margen interno izquierdo indican uno o varios procesos (desactivados de forma predeterminada, se activan mediante el menú contextual de la ventana Subprocesos) Menú contextual:

- Cambiar a un subproceso
- Marcar un subproceso para su estudio adicional
- Quitar el marcador a un subproceso
Barra de herramientas Ubicación de depuración - Proceso actual
- Suspender la aplicación
- Reanudar la aplicación
- Suspender y cerrar la aplicación
- Subproceso actual
- Alternar estado marcado del subproceso actual
- Mostrar sólo los subprocesos marcados
- Mostrar solo proceso actual
- Marco de pila actual
- Cambiar a otro proceso
- Suspender, reanudar o cerrar la aplicación
- Modificar a otro subproceso en el proceso actual
- Modificar a otro marco de pila en el subproceso actual
- Marcar o desmarcar subprocesos
- Mostrar sólo los subprocesos marcados
- Mostrar solo el proceso actual
Ventana Pilas paralelas - Pilas de llamadas para varios subprocesos en una ventana.
- Marco de pila activa para cada subproceso.
- Llamadores y destinatarios de cualquier método.
- Detección de interbloqueos
- Filtrar subprocesos especificados
- Filtrar pilas de código externo
- Cambiar a vista de tareas
- Marcar o demarcar un subproceso
- Acercar
- Copiar marcos de pila
- Guardar o exportar todas las pilas como imagen
Ventana Inspección paralela - La columna de marcas, en la que puede marcar un subproceso al que desee prestar especial atención.
- La columna de marcos, en la que una flecha indica el marco seleccionado.
- Una columna configurable que puede mostrar el equipo, proceso, mosaico, tarea y subproceso.
- Marcar o demarcar un subproceso
- Mostrar solo subprocesos marcados
- Cambiar marcos
- Ordenar una columna
- Agrupar subprocesos
- Inmovilizar o reanudar subprocesos
- Exportar los datos en la ventana Inspección paralela
Ventana Tareas - Vea información sobre los objetos Task, como el identificador de tarea, el estado de la tarea (programado, en ejecución, en espera, interbloqueado) y qué subproceso está asignado a la tarea.
- Ubicación actual en la pila de llamadas.
- Delegado pasado a la tarea en el momento de creación
- Pasar a la tarea actual
- Marcar o desmarcar una tarea
- Inmovilizar o reanudar una tarea
Ventana Subprocesos de GPU - La columna de marcas, en la que puede marcar un subproceso al que desee prestar especial atención.
- La columna de subproceso actual, donde una flecha amarilla indica el subproceso actual.
- La columna Recuento de subprocesos, que muestra el número de subprocesos en la misma ubicación.
- La columna Línea, que muestra la línea de código en la que se encuentra cada grupo de subprocesos.
- La columna Dirección, que muestra la dirección de instrucción en la que se encuentra cada grupo de subprocesos.
- La columna Ubicación, que es la ubicación en el código de la dirección.
- La columna Estado, que muestra si el subproceso está activo o bloqueado.
- La columna Mosaico, que muestra el índice del mosaico para los subprocesos de la fila.
- Cambiar a otro subproceso
- Mostrar un mosaico y subproceso determinados
- Mostrar u ocultar una columna
- Ordenar por columna
- Agrupar subprocesos
- Inmovilizar o reanudar subprocesos
- Marcar o demarcar un subproceso
- Mostrar solo subprocesos marcados