Compartir a través de


bp, bu, bm (Establecer punto de interrupción)

Los comandos bp, bu y bm establecen uno o varios puntos de interrupción de software. Puede combinar ubicaciones, condiciones y opciones para establecer diferentes tipos de puntos de interrupción de software.

Modo de usuario

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

Modo kernel

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

Parámetros

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

ID
Especifica un número decimal que identifica un punto de interrupción.

El depurador asigna el identificador cuando crea el punto de interrupción, pero puede cambiarlo mediante el comando br (Breakpoint Renumber). Puede usar el identificador para hacer referencia al punto de interrupción en comandos posteriores del depurador. Para mostrar el identificador de un punto de interrupción, use el comando bl (Lista de puntos de interrupción).

Cuando use id. en un comando, no escriba un espacio entre el comando (bp o bu) y el número de identificador.

El parámetro ID siempre es opcional. Si no especifica el identificador, el depurador usa el primer número de punto de interrupción disponible. En el modo kernel, solo puede establecer 32 puntos de interrupción. En el modo de usuario, puede establecer cualquier número de puntos de interrupción. En cualquier caso, no hay ninguna restricción en el 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.

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

/1
Crea un punto de interrupción de "una sola vez". Una vez desencadenado este punto de interrupción, se elimina 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
Activa el punto de interrupción solo cuando la profundidad de la pila de llamadas es menor que MaxCallStackDepth. No puede usar esta opción junto con /C.

/C MinCallStackDepth
Activa el punto de interrupción solo cuando la profundidad de la pila de llamadas es mayor que MinCallStackDepth. No puede usar esta opción junto con /c.

/a
(Solo para bm ) Establece puntos de interrupción en todas las ubicaciones especificadas, tanto si están en el espacio de datos como en el espacio de código. Dado que los puntos de interrupción de los datos pueden provocar errores de programa, use esta opción solo en ubicaciones que se sabe que son seguras.

/d
(Solo para bm ) Convierte las ubicaciones del punto de interrupción en direcciones. Por lo tanto, si se mueve el código, los puntos de interrupción permanecen en la misma dirección, en lugar de establecerse según SymbolPattern. Use /d para evitar volver a evaluar los cambios en los puntos de interrupción cuando los módulos se carguen o descarguen.

/(
(Solo para bm ) Incluye información de lista de parámetros en la cadena de símbolos que define SymbolString .

Esta característica permite establecer puntos de interrupción en funciones sobrecargadas que tienen el mismo nombre pero listas de parámetros diferentes. Por ejemplo, bm /( myFunc establece puntos de interrupción en myFunc(int a) y myFunc(char a). Sin "/(", se produce un error en un punto de interrupción establecido en myFunc porque no indica para qué función myFunc está destinado el punto de interrupción.

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 localVariable.

bp /w "localVariable == 4" mymodule!myfunction

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

bp /w "@$scriptContents.myFunc(localVariable)" @rip

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 el primer byte de la instrucción donde se establece el punto de interrupción. 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 del pase de ejecución en el que se activa el punto de interrupción. El depurador omite la ubicación del punto de interrupción hasta que alcanza el paso especificado. El valor de Passes puede ser cualquier valor de 16 o 32 bits.

De forma predeterminada, el punto de interrupción está activo la primera vez que la aplicación ejecuta el código que contiene la ubicación del punto de interrupción. Esta situación predeterminada es equivalente a un valor de 1 para Passes. Para activar el punto de interrupción solo después de que la aplicación ejecute el código al menos una vez, escriba un valor de 2 o más. Por ejemplo, un valor de 2 activa el punto de interrupción la segunda vez que se ejecuta el código.

Este parámetro crea un contador que se disminuye en cada paso por el código. Para ver los valores iniciales y actuales del contador Pases, use bl (Lista de puntos de interrupción).

El contador Passes solo se disminuye cuando la aplicación se ejecuta más allá del punto de interrupción en respuesta a un comando g (Go). El contador no se reduce si va a recorrer el código o el seguimiento después de él. Cuando el contador Passes alcanza 1, solo puede restablecerlo borrando y restableciendo el punto de interrupción.

CommandString
Especifica una lista de comandos que se ejecutan cada vez que se encuentra el punto de interrupción el número de veces especificado. Debe incluir el parámetro CommandString entre comillas. Use punto y coma para separar varios comandos.

Los comandos del depurador en CommandString pueden incluir parámetros. 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.

Los comandos CommandString solo se ejecutan si se alcanza el punto de interrupción mientras la aplicación se ejecuta en respuesta a un comando g (Go). Los comandos no se ejecutan si recorre el código o traza más allá de este punto.

Cualquier comando que reanude la ejecución del programa después de un punto de interrupción (como g o t) finaliza la ejecución de la lista de comandos.

SymbolPattern
Especifica un patrón. El depurador intenta hacer coincidir este patrón con los símbolos existentes y establecer puntos de interrupción en todas las coincidencias de patrones. SymbolPattern puede contener una variedad de caracteres comodín y especificadores. Para obtener más información sobre esta sintaxis, vea Sintaxis de caracteres comodín de cadena. Dado que estos caracteres se coinciden con símbolos, la coincidencia no distingue mayúsculas de minúsculas y un único carácter de subrayado inicial (_) representa cualquier cantidad de caracteres de subrayado iniciales.

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 y ejemplos de cómo usar puntos de interrupción, otros comandos y métodos de punto de interrupción de control de puntos de interrupción y cómo establecer puntos de interrupción en el espacio de usuario desde un depurador de kernel, consulte 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

Los comandos bp, bu y bm establecen nuevos puntos de interrupción, pero tienen características diferentes:

  • El comando bp (Establecer punto de interrupción) establece un nuevo punto de interrupción en la dirección de la ubicación del punto de interrupción que se especifica en el comando. Si el depurador no puede resolver la expresión de dirección de la ubicación del punto de interrupción cuando se establece el punto de interrupción, el punto de interrupción bp se convierte automáticamente en un punto de interrupción bu . Use un comando bp para crear un punto de interrupción que ya no esté activo si el módulo se descarga.

  • El comando bu (Establecer punto de interrupción sin resolver) establece un punto de interrupción diferido o sin resolver . Un punto de interrupción bu se establece en una referencia simbólica a la ubicación del punto de interrupción que se especifica en el comando (no en una dirección) y se activa cada vez que se resuelve el módulo con la referencia. Para obtener más información sobre estos puntos de interrupción, vea Puntos de interrupción sin resolver (puntos de interrupción bu) .

  • El comando bm (Establecer punto de interrupción de símbolos) establece un nuevo punto de interrupción en símbolos que coinciden con un patrón especificado. Este comando puede crear más de un punto de interrupción. De forma predeterminada, después de que el patrón coincida, los puntos de interrupción bm son los mismos que los puntos de interrupción bu . Es decir, los puntos de interrupción bm son puntos de interrupción diferidos que se establecen en una referencia simbólica. Sin embargo, un comando bm /d crea uno o varios puntos de interrupción bp . Cada punto de interrupción se establece en la dirección de una ubicación coincidente y no realiza un seguimiento del estado del módulo.

Si no está seguro de qué comando se usó para establecer un punto de interrupción existente, use .bpcmds (Mostrar comandos de punto de interrupción) para enumerar todos los puntos de interrupción junto con los comandos que se usaron para crearlos.

Hay tres diferencias principales entre los puntos de interrupción bp y los puntos de interrupción bu:

  • Una ubicación de punto de interrupción bp siempre se convierte en una dirección. Si un cambio de módulo mueve el código en el que se estableció un punto de interrupción bp, el punto de interrupción permanece en la misma dirección. Por otro lado, un punto de interrupción bu permanece asociado con el valor simbólico (normalmente un símbolo más un desplazamiento) que se usó y realiza un seguimiento de esta ubicación simbólica incluso si su dirección cambia.

  • Si se encuentra una dirección de punto de interrupción bp en un módulo cargado y, si ese módulo se descarga más adelante, el punto de interrupción se quita de la lista de puntos de interrupción. Por otro lado, los puntos de interrupción bu persisten después de cargas y descargas repetidas.

  • Los puntos de interrupción establecidos con bp no se guardan en áreas de trabajo de WinDbg. Los puntos de interrupción que se establecen con bu se guardan en áreas de trabajo.

El comando bm es útil cuando desea usar caracteres comodín en el patrón de símbolos para un punto de interrupción. La sintaxis bm SymbolPattern es equivalente a usar x SymbolPattern y, a continuación, usar bu en cada resultado. Por ejemplo, para establecer puntos de interrupción en todos los símbolos del módulo Myprogram que comienzan con la cadena "mem", use el siguiente comando.

Ejemplo

0:000> bm myprogram!mem* 
  4: 0040d070 MyProgram!memcpy
 5: 0040c560 MyProgram!memmove
  6: 00408960 MyProgram!memset

Dado que el comando bm establece puntos de interrupción de software (no puntos de interrupción del procesador), excluye automáticamente la ubicación de los datos cuando establece puntos de interrupción para evitar daños en los datos.

Es posible especificar una dirección de datos en lugar de una dirección de programa al usar los comandos bp o bm /a. Sin embargo, incluso si se especifica una ubicación de datos, estos comandos crean puntos de interrupción de software, no puntos de interrupción del procesador. Si se coloca un punto de interrupción de software en los datos del programa en lugar del código ejecutable, puede provocar daños en los datos. Por lo tanto, debe usar estos comandos en una ubicación de datos solo si está seguro de que la memoria almacenada en esa ubicación se usará como código ejecutable y no como datos del programa. De lo contrario, debe usar el comando ba (Interrumpir en Access) en su lugar. Para obtener más información, consulte Puntos de interrupción del procesador (puntos de interrupción ba) .

Para obtener más información sobre cómo establecer un punto de interrupción en una ubicación especificada por una sintaxis más complicada, como un miembro de una clase pública de C++ o una cadena de texto arbitraria que contenga caracteres restringidos de otro modo, vea Sintaxis de punto de interrupción.

Si una sola línea de origen lógica abarca varias líneas físicas, el punto de interrupción se establece en la última línea física de la instrucción o llamada. Si el depurador no puede establecer un punto de interrupción en la posición solicitada, coloca el punto de interrupción en la siguiente posición permitida.

Si especifica Subproceso, los puntos de interrupción se establecen en los subprocesos especificados. Por ejemplo, el comando ~*bp establece puntos de interrupción en todos los subprocesos, ~#bp establece un punto de interrupción en el subproceso que provoca la excepción actual y ~123bp establece un punto de interrupción en el subproceso 123. Los comandos ~bp y ~.bp establecen un punto de interrupción en el subproceso actual.

Al depurar un sistema multiprocesador en modo kernel, los puntos de interrupción establecidos mediante bp o ba (Interrumpir en acceso) se aplican a todos los procesadores. Por ejemplo, si el procesador actual es 3 y escribe bp MemoryAddress para colocar un punto de interrupción en MemoryAddress. Cualquier procesador que se ejecuta en esa dirección (no solo el procesador 3) provoca una captura de punto de interrupción.

Los comandos bp, bu y bm establecen puntos de interrupción de software reemplazando la instrucción del procesador por una instrucción de interrupción. Para depurar código de solo lectura o código que no se puede cambiar, use un comando ba e, donde e representa el acceso de solo ejecución.

El siguiente comando establece un punto de interrupción de 12 bytes más allá del principio de la función MyTest. Este punto de interrupción se omite para los seis primeros pasos a través del código, pero la ejecución se detiene en el séptimo paso por el código.

0:000> bp MyTest+0xb 7 

El siguiente comando establece un punto de interrupción en RtlRaiseException, muestra el registro eax , muestra el valor del símbolo MyVar y continúa.

kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"

Los dos comandos bm siguientes establecen tres puntos de interrupción. Cuando se ejecutan los comandos, el resultado mostrado no distingue entre los puntos de interrupción creados con el modificador /d y los creados sin él. Los .bpcmds (Comandos de punto de interrupción de visualización) se pueden usar para distinguir entre estos dos tipos. Si el punto de interrupción se creó mediante bm sin el modificador /d, la pantalla .bpcmds indica el tipo de punto de interrupción como bu, seguido del símbolo evaluado incluido en el token @!"" (que indica que es un símbolo literal y no una expresión numérica o un registro). Si bm creó el punto de interrupción con el modificador /d, la pantalla .bpcmds indica el tipo de punto de interrupción como bp.

0:000> bm myprog!openf* 
  0: 00421200 @!"myprog!openFile"
  1: 00427800 @!"myprog!openFilter"

0:000> bm /d myprog!closef* 
  2: 00421600 @!"myprog!closeFile"

0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;