Compartir a través de


ba (Interrumpir el acceso)

El comando ba establece un punto de interrupción del procesador (a menudo denominado, con menos precisión, punto de interrupción de datos). Este punto de interrupción se desencadena cuando se accede a la memoria especificada.

Modo de usuario

[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Modo kernel

ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Parámetros

Hilo
Especifica el subproceso al que se aplica el punto de interrupción. Para más información sobre la sintaxis, consulte Sintaxis de subproceso. Solo puede especificar subprocesos en modo de usuario.

ID
Especifica un número opcional que identifica el punto de interrupción. Si no especifica el identificador, se usa el primer número de punto de interrupción disponible. No puede agregar espacio entre ba y el número de identificador. Cada procesador solo admite un número limitado de puntos de interrupción del procesador, pero no hay ninguna restricción en cuanto al valor del número de identificador. Si incluye el identificador entre corchetes ([]), el identificador puede incluir cualquier expresión. Para obtener más información sobre la sintaxis, consulte Sintaxis de expresión numérica.

Acceso
Especifica el tipo de acceso que satisface el punto de interrupción. Este parámetro puede ser uno de los valores siguientes.

Opción Action

e (ejecutar)

Interrumpe el depurador cuando la CPU recupera una instrucción de la dirección especificada.

r (lectura/escritura)

Interrumpe el depurador cuando la CPU lee o escribe en la dirección especificada.

w (escritura)

Interrumpe el depurador cuando la CPU escribe en la dirección especificada.

i (e/s)

(Solo en modo kernel, solo sistemas basados en x86) Interrumpe el depurador cuando se accede al puerto de E/S en la dirección especificada.

Tamaño
Especifica el tamaño de la ubicación, en bytes, para supervisar el acceso. En un procesador basado en x86, este parámetro puede ser 1, 2 o 4. Sin embargo, si Access es igual a e, Size debe ser 1.

En un procesador basado en x64, este parámetro puede ser 1, 2, 4 o 8. Sin embargo, si Access es igual a e, Size debe ser 1.

Options Especifica las opciones de punto de interrupción. Puede usar cualquier número de las siguientes opciones, excepto como se indica:

/1
Crea un punto de interrupción de "una sola vez". Después de desencadenar este punto de interrupción, se quita permanentemente de la lista de puntos de interrupción.

/p EProcess
(Solo en modo kernel) Especifica un proceso asociado a este punto de interrupción. EProcess debe ser la dirección real de la estructura EPROCESS, no el PID. El punto de interrupción solo se desencadena si se encuentra en el contexto de este proceso.

/t EThread
(Solo en modo kernel) Especifica un subproceso asociado a este punto de interrupción. EThread debe ser la dirección real de la estructura ETHREAD , no el identificador del subproceso. El punto de interrupción solo se desencadena si se encuentra en el contexto de este subproceso. Si usa /p EProcess y /t EThread , puede escribirlos en cualquier orden.

/c MaxCallStackDepth
Hace que el punto de interrupción se active solo cuando la profundidad de la pila de llamadas sea menor que MaxCallStackDepth. No se puede combinar esta opción con /C.

/C MinCallStackDepth
Hace que el punto de interrupción se active solo cuando la profundidad de la pila de llamadas sea mayor que MinCallStackDepth. No se puede combinar esta opción con /c.

Expresión de objeto /w dx Establece un punto de interrupción condicional basado en el valor booleano devuelto por la expresión de objeto dx. El argumento es una expresión de modelo de datos (dx) que se evalúa como true (coincide con la condición – interrupción) o false (no coincide con la condición , no se interrumpe).

En este ejemplo se establece un punto de interrupción condicional basado en el valor de globalVariable. Esto permite que un punto de interrupción de acceso, por ejemplo, compruebe el valor que se escribió al determinar si el depurador debe interrumpir.

ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable

En este ejemplo se muestra cómo establecer un punto de interrupción mediante JavaScript.

ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable

Para obtener más información sobre los objetos del depurador, consulte dx (Mostrar la expresión del modelo de objeto del depurador).

Para obtener más información sobre los puntos de interrupción condicionales, consulte Establecimiento de un punto de interrupción condicional.

Dirección
Especifica cualquier dirección válida. Si la aplicación accede a la memoria en esta dirección, el depurador detiene la ejecución y muestra los valores actuales de todos los registros y marcas. Esta dirección debe ser un desplazamiento y debe estar alineada adecuadamente para que coincida con el parámetro Size. (Por ejemplo, si Size es 4, Address debe ser un múltiplo de 4). Si omite Address, se usa el puntero de instrucción actual. Para obtener más información sobre la sintaxis, consulte Direcciones y sintaxis de intervalo de direcciones.

Pasa
Especifica el número de veces que pasa el punto de interrupción hasta que se activa. Este número puede ser cualquier valor de 16 bits. El número de veces que el contador de programa pasa por este punto sin interrumpirse es uno menos que el valor de este número. Por lo tanto, omitir este número es lo mismo que establecerlo en 1. Tenga en cuenta también que este número solo cuenta las veces que la aplicación se ejecuta pasado este punto. Pasar o ir más allá de este punto no cuenta. Una vez alcanzado el recuento completo, solo puede restablecer este número borrando y restableciendo el punto de interrupción.

CommandString
Especifica una lista de comandos que se ejecutarán cada vez que se encuentre el punto de interrupción el número de veces especificado. Estos comandos solo se ejecutan si se alcanza el punto de interrupción después de emitir un comando g (Ir) en lugar de hacerlo después de un comando t (Seguimiento) o p (Paso). Los comandos del depurador en CommandString pueden incluir parámetros.

Debe incluir esta cadena de comando entre comillas y debe separar varios comandos por punto y coma. Puede usar caracteres de control C estándar (como \n y \"). Los punto y coma incluidos entre comillas de segundo nivel (\") se interpretan como parte de la cadena entre comillas incrustada.

Este parámetro es opcional.

Entorno

Elemento Descripción
Modos modo de usuario, modo kernel
Destinos solo depuración en vivo
Platforms all

Información adicional

Para obtener más información sobre los puntos de interrupción del procesador, consulte Puntos de interrupción del procesador (puntos de interrupción ba). Para obtener más información al respecto y ejemplos de uso de puntos de interrupción, otros comandos y métodos de punto de interrupción para controlar puntos de interrupción e información sobre cómo establecer puntos de interrupción en el espacio de usuario desde un depurador de kernel, vea Uso de puntos de interrupción. Para obtener más información sobre los puntos de interrupción condicionales, consulte Establecimiento de un punto de interrupción condicional.

Comentarios

El depurador utiliza el número de identificador para referirse al punto de interrupción en los comandos posteriores bc (Borrar punto de interrupción), bd (Deshabilitar punto de interrupción) y be (Habilitar punto de interrupción).

Use el comando bl (Lista de puntos de interrupción) para enumerar todos los puntos de interrupción existentes, sus números de identificador y su estado.

Use el comando .bpcmds (Mostrar comandos de punto de interrupción) para enumerar todos los puntos de interrupción existentes, sus números de identificador y los comandos que se usaron para crearlos.

Cada punto de interrupción del procesador tiene un tamaño asociado. Por ejemplo, un punto de interrupción de procesador w (escritura) podría establecerse en la dirección 0x70001008 con un tamaño de cuatro bytes. Esto supervisaría el bloque de direcciones de 0x70001008 a 0x7000100B, ambos incluidos. Si se escribe en este bloque de memoria, se desencadenará el punto de interrupción.

Puede ocurrir que el procesador realice una operación en una región de memoria que se superponga con la región especificada, pero que no es idéntica a esta. En este ejemplo, una operación de escritura única que incluya el intervalo 0x70001000 a 0x7000100F, o una operación de escritura que incluya solo el byte en 0x70001009, sería una operación superpuesta. En tal situación, el hecho de que se desencadene el punto de interrupción depende del procesador. Debe consultar el manual del procesador para obtener detalles específicos. Por ejemplo, en un procesador x86, un punto de interrupción de lectura o escritura se desencadena siempre que el intervalo al que se accede se solapa con el intervalo del punto de interrupción.

Del mismo modo, si se establece un punto de interrupción e (ejecutar) en la dirección 0x00401003 y, a continuación, se ejecuta una instrucción de dos bytes que abarca las direcciones 0x00401002 y 0x00401003, el resultado depende del procesador. De nuevo, consulte el manual de arquitectura del procesador para obtener más información.

El procesador distingue entre los puntos de interrupción establecidos por un depurador en modo de usuario y los puntos de interrupción establecidos por un depurador en modo kernel. Un punto de interrupción del procesador en modo de usuario no afecta a ningún proceso en modo kernel. Un punto de interrupción del procesador en modo kernel podría afectar o no a un proceso en modo de usuario, en función de si el código en modo de usuario usa el estado de registro de depuración y si hay un depurador en modo de usuario que está asociado.

Para aplicar los puntos de interrupción de datos existentes del proceso actual a un contexto de registro diferente, use el comando .apply_dbp (Aplicar punto de interrupción de datos a contexto).

En un equipo de varios procesadores, cada punto de interrupción de procesador se aplica a todos los procesadores. Por ejemplo, si el procesador actual es 3 y usa el comando ba e1 MyAddress para colocar un punto de interrupción en MyAddress, cualquier procesador ,no solo procesador 3, que se ejecute en esa dirección desencadena el punto de interrupción. (Esto también se mantiene para los puntos de interrupción de software).

No puede crear varios puntos de interrupción del procesador en la misma dirección que solo difieren en sus valores de CommandString. Sin embargo, puede crear varios puntos de interrupción en la misma dirección que tengan restricciones diferentes (por ejemplo, valores diferentes de las opciones /p, /t, /c y /C).

Para obtener más información sobre los puntos de interrupción del procesador y las restricciones adicionales que se aplican a ellos, consulte Puntos de interrupción del procesador (puntos de interrupción ba).

En los ejemplos siguientes se muestra el comando ba. El comando siguiente establece un punto de interrupción para el acceso de lectura en 4 bytes de la variable myVar.

0:000> ba r4 myVar

El comando siguiente agrega un punto de interrupción en todos los puertos serie con direcciones de 0x3F8 a través de 0x3FB. Este punto de interrupción se desencadena si se lee o escribe algo en estos puertos.

kd> ba i4 3f8