Controlar subprocesos y procesos

Para obtener información general sobre los subprocesos y procesos en el motor del depurador, consulte Subprocesos y procesos.

Cuando se produce un evento, el subproceso de evento y el proceso de eventos se establecen en el subproceso y el proceso (sistema operativo o virtual) en el que se produjo el evento. Se pueden encontrar mediante GetEventThread y GetEventProcess, respectivamente.

Subprocesos y procesos implícitos

En la depuración en modo kernel, el motor del depurador usará el proceso implícito para determinar qué espacio de direcciones virtuales se usará al realizar la traducción de direcciones virtuales a físicas, por ejemplo, en los métodos VirtualToPhysical y ReadVirtual. Cuando se produce un evento, el proceso implícito se establece en el proceso actual.

El proceso implícito se puede cambiar mediante SetImplicitProcessDataOffset. Para determinar el proceso implícito, use GetImplicitProcessDataOffset.

Nota Al establecer puntos de interrupción durante una sesión de depuración de kernel activa, el motor del depurador pasará la dirección virtual del punto de interrupción al destino y el destino establecerá el punto de interrupción. En este caso, solo se utiliza el contexto de proceso del destino al controlar el punto de interrupción; El valor del proceso implícito es irrelevante.

En la depuración en modo kernel, el motor del depurador usará el subproceso implícito para determinar algunos de los registros del destino. Esto incluye la pila del procesador (consulte GetStackOffset), el desplazamiento del marco (consulte GetFrameOffset) y el desplazamiento de instrucciones (consulte GetInstructionOffset). Cuando se produce un evento, el subproceso implícito se establece en el subproceso actual.

El subproceso implícito se puede cambiar mediante SetImplicitThreadDataOffset. Para determinar el subproceso implícito, use GetImplicitThreadDataOffset.

El subproceso implícito no determina todos los registros. Algunos registros seguirán siendo los mismos cuando se cambie el subproceso implícito.

Advertencia El proceso implícito y el subproceso implícito son independientes. Si el subproceso implícito no pertenece al proceso implícito, el usuario y el estado de sesión del subproceso implícito estarán en el espacio de direcciones virtuales incorrecto y los intentos de acceder a esta información provocarán errores o proporcionarán resultados incorrectos. Este problema no se produce al acceder a la memoria del kernel, ya que las direcciones de memoria del kernel son constantes en todos los espacios de direcciones virtuales. Por lo tanto, se puede tener acceso a la información del subproceso implícito ubicado en la memoria del kernel independientemente del proceso implícito.

Hilos

El motor de depurador usa el identificador de subproceso del motor para identificar cada subproceso del sistema operativo y cada subproceso virtual para un destino.

Mientras se detiene un destino, cada subproceso también tiene un índice relativo al proceso al que pertenece. Para cualquier proceso, el índice del primer subproceso del proceso es cero y el índice del último subproceso es el número de subprocesos del proceso menos uno. El número de subprocesos del proceso actual se puede encontrar mediante GetNumberThreads. El número total de subprocesos de todos los procesos del destino actual se puede encontrar mediante GetTotalNumberThreads.

El identificador del subproceso del motor y el identificador del subproceso del sistema para uno o varios subprocesos del proceso actual se pueden encontrar desde su índice mediante GetThreadIdsByIndex.

El motor mantiene varios fragmentos de información sobre cada subproceso. Esta información se puede consultar para el subproceso actual y se puede usar para buscar el identificador del subproceso del motor de un subproceso.

identificador de subproceso del sistema (solo depuración en modo de usuario)
El identificador del subproceso del sistema del subproceso actual se puede encontrar mediante GetCurrentThreadSystemId. Para un identificador de subproceso del sistema determinado, se puede encontrar el identificador de subproceso del motor correspondiente mediante GetThreadIdBySystemId.

bloque de entorno de subproceso (TEB)
La dirección del TEB para el subproceso actual se puede encontrar mediante GetCurrentThreadTeb. Para una dirección TEB determinada, se puede encontrar el identificador del subproceso del motor correspondiente mediante GetThreadIdByTeb. En la depuración en modo kernel, el TEB de un subproceso (virtual) es el TEB del subproceso del sistema que se estaba ejecutando en el procesador correspondiente cuando se produjo el último evento.

desplazamiento de datos
En la depuración en modo de usuario, el desplazamiento de datos de un subproceso (sistema) es la ubicación del TEB para ese subproceso. En la depuración en modo kernel, el desplazamiento de datos de un subproceso (virtual) es la estructura KTHREAD del subproceso del sistema que se estaba ejecutando en el procesador correspondiente cuando se produjo el último evento. El desplazamiento de datos del subproceso actual se puede encontrar mediante GetCurrentThreadDataOffset. Para un desplazamiento de datos determinado, se puede encontrar el identificador del subproceso del motor correspondiente mediante GetThreadIdByDataOffset.

identificador del sistema
El identificador del sistema del subproceso actual se puede encontrar mediante GetCurrentThreadHandle. Para un identificador de sistema determinado, se puede encontrar el identificador de subproceso del motor correspondiente mediante GetThreadIdByHandle. En la depuración en modo kernel, se crea un identificador artificial para cada proceso (virtual). Este identificador solo se puede usar con consultas de API del motor de depurador.

Procesos

El motor de depurador usa el identificador de proceso del motor para identificar cada proceso del sistema operativo y cada proceso virtual para un destino.

Mientras se detiene un destino, cada proceso tiene un índice relativo al destino. El índice del primer proceso del destino es cero y el índice del último proceso es el número de procesos del destino menos uno. El número de procesos del destino actual se puede encontrar mediante GetNumberProcesses.

El identificador de proceso del motor y el identificador de proceso del sistema para uno o varios subprocesos del destino actual se pueden encontrar desde su índice mediante GetProcessIdsByIndex.

El motor mantiene varios fragmentos de información sobre cada proceso. Esta información se puede consultar para el proceso actual y se puede usar para buscar el identificador de proceso del motor para un proceso.

identificador de proceso del sistema (solo depuración en modo de usuario)
El identificador del proceso del sistema del proceso actual se puede encontrar mediante GetCurrentProcessSystemId. Para un identificador de proceso del sistema determinado, se puede encontrar el identificador de proceso del motor correspondiente mediante GetProcessIdBySystemId.

bloque de entorno de proceso (PEB)
La dirección del PEB para el proceso actual se puede encontrar mediante GetCurrentProcessPeb. Para una dirección PEB determinada, se puede encontrar el identificador de proceso del motor correspondiente mediante GetProcessIdByPeb. En la depuración en modo kernel, el PEB del proceso (virtual) es el PEB del proceso del sistema que se estaba ejecutando cuando se produjo el último evento.

desplazamiento de datos
En la depuración en modo de usuario, el desplazamiento de datos de un proceso (sistema) es la ubicación del PEB de ese proceso. En la depuración en modo kernel, el desplazamiento de datos del proceso (virtual) es la estructura KPROCESS del proceso del sistema que se estaba ejecutando cuando se produjo el último evento. El desplazamiento de datos del proceso actual se puede encontrar mediante GetCurrentProcessDataOffset. Para un desplazamiento de datos determinado, se puede encontrar el identificador de proceso del motor correspondiente mediante GetProcessIdByDataOffset.

identificador del sistema
El identificador del sistema del proceso actual se puede encontrar mediante GetCurrentProcessHandle. Para un identificador de sistema determinado, se puede encontrar el identificador de proceso del motor correspondiente mediante GetProcessIdByHandle. En la depuración en modo kernel, se crea un identificador artificial para el proceso (virtual). Este identificador solo se puede usar con consultas del motor del depurador.

Eventos

En la depuración en modo de usuario en directo, cada vez que se crea o sale un subproceso en un destino, se generan los eventos de depuración create-thread y exit-thread. Estos eventos dan lugar a llamadas a los métodos de devolución de llamada IDebugEventCallbacks::CreateThread e IDebugEventCallbacks::ExitThread .

En la depuración en modo de usuario activa, cada vez que se crea o sale un proceso en un destino, se generan los eventos de depuración create-process y exit-process. Estos eventos dan lugar a llamadas a los métodos de devolución de llamada IDebugEventCallbacks::CreateProcess e IDebugEventCallbacks::ExitProcess .

Para obtener más información sobre los eventos, vea Supervisión de eventos.

Información adicional

Para obtener más información sobre los subprocesos y procesos, incluidas las estructuras TEB, KTHREAD, PEB y KPROCESS, vea Microsoft Windows Internals by David Salomón y Mark Russinovich.