Cambiar contextos

En la depuración en modo kernel, hay muchos procesos, subprocesos y, a veces, sesiones de usuario que se ejecutan al mismo tiempo. Therfore, frases como "dirección virtual 0x80002000" o "registro eax " son ambiguas. Debe especificar el contexto en el que se pueden entender estas frases.

El depurador tiene cinco contextos diferentes que puede establecer mientras está depurando:

  1. El contexto de sesión indica la sesión de usuario predeterminada.

  2. El contexto del proceso determina cómo interpreta el depurador las direcciones virtuales.

  3. El contexto de dirección en modo de usuario casi nunca se establece directamente. Este contexto se establece automáticamente al cambiar el contexto del proceso.

  4. El contexto de registro determina cómo interpreta el depurador los registros y también controla los resultados de un seguimiento de pila. Este contexto también se conoce como contexto de subproceso, aunque ese término no es completamente preciso. Un contexto explícito también es un tipo de contexto de registro. Si especifica un contexto explícito, ese contexto se usa en lugar del contexto de registro actual.

  5. El contexto local determina cómo el depurador interpreta las variables locales. Este contexto también se conoce como ámbito.

Contexto de sesión

Se pueden ejecutar varias sesiones de inicio de sesión al mismo tiempo. Cada sesión de inicio de sesión tiene sus propios procesos.

La extensión !session muestra todas las sesiones de inicio de sesión o cambia el contexto de sesión actual.

Las extensiones !sprocess y !spoolused usan el contexto de sesión cuando el número de sesión se escribe como "-2".

Cuando se cambia el contexto de sesión, el contexto del proceso se cambia automáticamente al proceso activo para esa sesión.

Contexto de proceso

Cada proceso tiene su propio directorio de páginas que registra cómo se asignan las direcciones virtuales a direcciones físicas. Cuando se ejecuta cualquier subproceso dentro de un proceso, el sistema operativo Windows usa este directorio de páginas para interpretar las direcciones virtuales.

Durante la depuración en modo de usuario, el proceso actual determina el contexto del proceso. Las direcciones virtuales que se usan en los comandos del depurador, las extensiones y las ventanas de información de depuración se interpretan mediante el directorio de páginas del proceso actual.

Durante la depuración en modo kernel, puede establecer el contexto del proceso mediante el comando .process (Establecer contexto de proceso). Use este comando para seleccionar el directorio de páginas del proceso que se usa para interpretar las direcciones virtuales. Después de establecer el contexto de proceso, puede usar este contexto en cualquier comando que tome direcciones. Incluso puede establecer puntos de interrupción en esta dirección. Al incluir una opción /i en el comando .process para especificar la depuración invasiva, también puede usar el depurador de kernel para establecer puntos de interrupción en el espacio del usuario.

También puede establecer puntos de interrupción en modo de usuario desde el depurador de kernel mediante un punto de interrupción específico del proceso en una función de espacio kernel. Establezca puntos de interrupción estratégicos y espere a que aparezca el contexto adecuado.

El contexto de dirección del modo de usuario forma parte del contexto del proceso. Normalmente, no es necesario establecer el contexto de dirección en modo de usuario directamente. Si establece el contexto del proceso, el contexto de dirección en modo de usuario cambia automáticamente a la base de directorios de la tabla de páginas correspondiente para el proceso.

Al establecer el contexto de proceso durante la depuración en modo kernel, ese contexto de proceso se conserva hasta que otro comando .process cambia el contexto. El contexto de dirección del modo de usuario también se conserva hasta que un comando .process o .context lo cambia. Estos contextos no se cambian cuando se ejecuta el equipo de destino y no se ven afectados por los cambios en el contexto de registro o en el contexto local.

Registrar contexto

Cada subproceso tiene sus propios valores de registro. Estos valores se almacenan en los registros de CPU cuando se ejecuta el subproceso y se almacenan en memoria cuando se ejecuta otro subproceso.

Durante la depuración en modo de usuario, el subproceso actual normalmente determina el contexto de registro. Cualquier referencia a registros en los comandos, extensiones y ventanas de información de depuración del depurador se interpreta según los registros del subproceso actual.

Puede cambiar el contexto de registro a un valor distinto del subproceso actual mientras realiza la depuración en modo de usuario mediante uno de los siguientes comandos:

.cxr (Mostrar registro de contexto)

.ecxr (Mostrar registro de contexto de excepción)

Durante la depuración en modo kernel, puede controlar el contexto de registro mediante una variedad de comandos del depurador, incluidos los siguientes comandos:

.thread (Establecer contexto de registro)

.cxr (Mostrar registro de contexto)

.trap (Mostrar marco de captura)

Estos comandos no cambian los valores de los registros de CPU. En su lugar, el depurador recupera el contexto de registro especificado de su ubicación en memoria. En realidad, el depurador solo puede recuperar los valores de registro guardados . (Otros valores se establecen dinámicamente y no se guardan. Los valores guardados son suficientes para volver a crear un seguimiento de pila.

Una vez establecido el contexto de registro, se usa el nuevo contexto de registro para los comandos que usan valores de registro, como k (Display Stack Backtrace) y r (Registers).

Sin embargo, al depurar equipos multiprocesador, algunos comandos le permiten especificar un procesador. (Para obtener más información sobre estos comandos, vea Sintaxis de varios procesadores). Si especifica un procesador para un comando, el comando usa el contexto de registro del subproceso activo en el procesador especificado en lugar del contexto de registro actual, incluso si el procesador especificado es el procesador activo actualmente.

Además, si el contexto de registro no coincide con la configuración del modo de procesador actual, estos comandos generan una salida incorrecta o sin significado. Para evitar los errores de salida, los comandos que dependen del estado de registro producen un error hasta que cambie el modo de procesador para que coincida con el contexto de registro. Para cambiar el modo de procesador, use el comando .effmach (Effective Machine),

Cambiar el contexto de registro también puede cambiar el contexto local. De esta manera, el contexto de registro puede afectar a la visualización de variables locales.

Si se produce alguna ejecución, ejecución paso a paso o seguimiento de la aplicación, el contexto de registro se restablece inmediatamente para que coincida con la posición del contador del programa. En el modo de usuario, el contexto de registro también se restablece si se cambia el proceso o subproceso actual.

El contexto de registro afecta a los seguimientos de pila, ya que el seguimiento de la pila comienza en la ubicación a la que apunta el registro del puntero de pila (esp en un procesador basado en x86). Si el contexto de registro se establece en un valor no válido o inaccesible, no se pueden obtener seguimientos de pila.

Puede aplicar un punto de interrupción del procesador (punto de interrupción de datos) a un contexto de registro específico mediante el comando .apply_dbp (Aplicar punto de interrupción de datos a contexto).

Contexto local

Cuando se ejecuta un programa, el significado de las variables locales depende de la ubicación del contador del programa, ya que el ámbito de estas variables se extiende solo a la función en la que se definen.

Al realizar la depuración en modo de usuario o en modo kernel, el depurador usa el ámbito de la función actual (el marco actual de la pila) como contexto local. Para cambiar este contexto, use el comando .frame (Establecer contexto local) o haga doble clic en el marco deseado en la ventana Llamadas.

En la depuración en modo de usuario, el contexto local siempre es un marco dentro del seguimiento de pila del subproceso actual. En la depuración en modo kernel, el contexto local siempre es un marco dentro del seguimiento de pila del subproceso del contexto de registro actual.

Solo puede usar un marco de pila a la vez para el contexto local. No se puede acceder a las variables locales de otros marcos.

El contexto local se restablece si se produce alguno de los siguientes eventos:

  • Cualquier ejecución del programa, ejecución paso a paso o seguimiento

  • Cualquier uso del delimitador de subprocesos (~) en cualquier comando

  • Cualquier cambio en el contexto de registro

La extensión !for_each_frame permite ejecutar un solo comando repetidamente, una vez para cada marco de la pila. Este comando cambia el contexto local de cada fotograma, ejecuta el comando especificado y, a continuación, devuelve el contexto local a su valor original.