Compartir a través de


Control de marcas y parámetros de punto de interrupción

Hay varios métodos que se pueden usar para determinar información básica sobre los puntos de interrupción:

  • GetId devuelve el identificador del punto de interrupción.

  • GetType devuelve el tipo de punto de interrupción (software o procesador) y el tipo del procesador efectivo en el que se establece el punto de interrupción.

  • GetAdder devuelve el cliente que agregó el punto de interrupción.

  • GetOffset devuelve la dirección de un punto de interrupción.

  • GetOffsetExpression devuelve la cadena de expresión que especifica la ubicación del punto de interrupción.

Además de su ubicación y tipo de punto de interrupción, un punto de interrupción tiene varios parámetros que controlan su comportamiento.

Los parámetros de punto de interrupción se pueden controlar a través de una variedad de métodos específicos. Además, la mayoría de los parámetros se pueden consultar juntos mediante GetParameters.

Marcas de punto de interrupción

Las marcas de punto de interrupción son un tipo de parámetros de punto de interrupción.

Las marcas de punto de interrupción se pueden consultar mediante GetFlags. Se pueden cambiar mediante AddFlags, RemoveFlags o SetFlags.

Las marcas de punto de interrupción forman un campo de bits. Las marcas posibles que se pueden usar en este campo de bits y sus significados son las siguientes:

DEBUG_BREAKPOINT_ENABLED
Cuando se establece esta marca, el punto de interrupción está habilitado y tendrá su efecto normal. Cuando no se establece esta marca, el punto de interrupción está deshabilitado y no tendrá ningún efecto. Si desea desactivar temporalmente un punto de interrupción, puede quitar esta marca; Después, es fácil volver a agregar esta marca cuando desea volver a habilitar este punto de interrupción.

DEBUG_BREAKPOINT_ADDER_ONLY
Cuando se establece esta marca, el punto de interrupción es un punto de interrupción privado. Este punto de interrupción solo es visible para el cliente que lo agregó. En este caso, otros clientes no podrán consultar el motor para el punto de interrupción y el motor no enviará eventos generados por el punto de interrupción a otros clientes. Todas las devoluciones de llamada (evento y salida) relacionadas con este punto de interrupción solo se enviarán a este cliente. Consulte GetAdder.

DEBUG_BREAKPOINT_GO_ONLY
Cuando se establece esta marca, el punto de interrupción solo se desencadenará si el destino está en ejecución sin restricciones. No se desencadenará si el motor recorre las instrucciones del destino.

DEBUG_BREAKPOINT_ONE_SHOT
Cuando se establece esta marca, el punto de interrupción se quitará automáticamente la primera vez que se desencadene.

DEBUG_BREAKPOINT_DEFERRED
Cuando se establece esta marca, se aplaza el punto de interrupción. El motor establece esta marca cuando se especifica el desplazamiento del punto de interrupción mediante una expresión simbólica y el motor no puede evaluar la expresión. Cada vez que se carga o no se carga un módulo en el destino, el motor intentará volver a evaluar la expresión para todos los puntos de interrupción cuya ubicación se especifica mediante una expresión. Los que no se pueden evaluar se marcan como diferidos. Ningún cliente no puede modificar esta marca.

Otros parámetros de punto de interrupción

Los parámetros de punto de interrupción también incluyen:

Recuento de pases
Si el punto de interrupción tiene asociado un recuento de pases, no se activará hasta que el destino haya pasado el punto de interrupción el número de veces especificado. El recuento de pases que se estableció originalmente se puede encontrar mediante GetPassCount. Número de veces que el motor pasará el punto de interrupción antes de que se active se puede encontrar mediante GetCurrentPassCount. El recuento de pases se puede restablecer a un nuevo valor mediante SetPassCount.

Coincidencia de subproceso
Si el punto de interrupción tiene un subproceso asociado, el motor lo omitirá cuando lo encuentre cualquier otro subproceso. El subproceso se puede encontrar mediante GetMatchThreadId y se puede cambiar mediante SetMatchThreadId.

Comando
El punto de interrupción puede tener un comando asociado. El comando se ejecuta cuando se activa el punto de interrupción. Este comando se puede encontrar mediante GetCommand y se puede cambiar mediante SetCommand.

Tamaño
Si el punto de interrupción es un punto de interrupción del procesador, debe tener un tamaño especificado. Esto determina el tamaño del bloque de memoria cuyo acceso activará el punto de interrupción: el principio del bloque es la ubicación del punto de interrupción. El tamaño se puede encontrar mediante GetDataParameters y se puede cambiar mediante SetDataParameters.

Tipo de acceso
Si el punto de interrupción es un punto de interrupción del procesador, debe tener un tipo de acceso. Esto determina el tipo de acceso que activará el punto de interrupción. Por ejemplo, el punto de interrupción se puede activar si el destino lee, escribe en o ejecuta la memoria especificada por el punto de interrupción. El tipo de acceso se puede encontrar mediante GetDataParameters y se puede cambiar mediante SetDataParameters.

Parámetros válidos para puntos de interrupción del procesador

Los siguientes tipos de acceso están disponibles para los puntos de interrupción del procesador:

Value Descripción

DEBUG_BREAK_READ

El punto de interrupción se desencadenará cuando la CPU lea memoria en el bloque de memoria del punto de interrupción.

DEBUG_BREAK_WRITE

El punto de interrupción se desencadenará cuando la CPU escriba memoria en el bloque de memoria del punto de interrupción.

DEBUG_BREAK_READ | DEBUG_BREAK_WRITE

El punto de interrupción se desencadenará cuando la CPU lea o escriba memoria en el bloque de memoria del punto de interrupción.

DEBUG_BREAK_EXECUTE

El punto de interrupción se desencadenará cuando la CPU capture la instrucción en el bloque de memoria del punto de interrupción.

DEBUG_BREAK_IO

El punto de interrupción se desencadenará cuando se acceda al puerto de E/S en el bloque de memoria de puntos de interrupción. (Solo Windows XP y Microsoft Windows Server 2003, modo kernel, solo x86)

No todos los tipos y tamaños de acceso son compatibles con todos los procesadores. Se admiten los siguientes tipos de acceso y tamaños:

x86
Se admiten todos los tipos de acceso. DEBUG_BREAK_READ se comporta como DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. El tamaño debe ser 1, 2 o 4. La dirección del punto de interrupción debe ser un múltiplo del tamaño.

x64
Se admiten todos los tipos de acceso. DEBUG_BREAK_READ se comporta como DEBUG_BREAK_READ | DEBUG_BREAK_WRITE. El tamaño debe ser 1, 2, 4 o 8. La dirección del punto de interrupción debe ser un múltiplo del tamaño.