Depurar aplicaciones multiproceso en Visual Studio
Un subproceso es una secuencia de instrucciones a la que el sistema operativo concede tiempo de procesador. Cada proceso que se ejecuta en el sistema operativo contiene al menos un subproceso. Los procesos que tienen más de un subproceso se denominan multiproceso.
Equipos con varios procesadores, procesadores de varios núcleos o procesos hyperthreading pueden ejecutar varios subprocesos simultáneos. El procesamiento en paralelo con muchos subprocesos puede mejorar considerablemente el rendimiento del programa, pero también puede dificultar la depuración porque se realiza el seguimiento de muchos subprocesos.
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.
Procesos y subprocesos
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.
Herramientas para depurar aplicaciones multiproceso
Visual Studio proporciona diferentes herramientas para la depuración de aplicaciones multiproceso.
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. Para obtener información sobre la ventana Subprocesos y la barra de herramientas Ubicación de depuración, vea Tutorial: Depuración con la ventana Subprocesos. Para obtener información sobre cómo usar las ventanas Pilas paralelas e Inspección paralela, vea Introducción a la depuración de aplicaciones multiproceso. Ambos temas muestran cómo usar los marcadores de subproceso.
En el caso del código que usa la Biblioteca TPL o el Runtime de simultaneidad, las herramientas principales para depurar son la ventana Pilas paralelas, la ventana Inspección paralela y la ventana Tareas, que también admite JavaScript. Para empezar, vea Tutorial: Depuración de una aplicación paralela y Tutorial: Depurar una aplicación de C++ AMP.
Para depurar subprocesos en la GPU, la herramienta principal es la ventana Subprocesos de GPU. Vea Cómo: usar la ventana Subprocesos de GPU.
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.
Visual Studio también proporciona eficaces puntos de interrupción y puntos de seguimiento, que pueden resultar útiles para depurar aplicaciones multiproceso. Use condiciones y filtros de puntos de interrupción para colocar puntos de interrupción en subprocesos individuales. Los puntos de seguimiento permiten poder seguir paso a paso la ejecución de su programa sin interrupciones, para estudiar problemas como los interbloqueos. Para más información, vea Acciones de punto de interrupción y puntos de seguimiento.
Depurar una aplicación multiproceso que tiene una interfaz de usuario puede resultar especialmente difícil. Puede que considere ejecutar la aplicación en un segundo equipo y usar la depuración remota. Para más información, vea Depuración remota.
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 |