Share via


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.

User-Mode

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

Kernel-Mode

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, vea Sintaxis de subprocesos. 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, vea Sintaxis de expresión numérica.

Opciones 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 un solo disparo". Una vez desencadenado este punto de interrupción, se elimina de la lista de puntos de interrupción.

/pEProcess
(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.

/tEThread
(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 /pEProcess y /tEThread, puede escribirlos en cualquier orden.

/cMaxCallStackDepth
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.

/CMinCallStackDepth
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.

/Un
(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 se carguen o descarguen los módulos.

/(
(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á previsto el punto de interrupción.

Expresión de objeto dx /w 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, vea dx (Display Debugger Object Model Expression).

Para obtener más información sobre los puntos de interrupción condicionales, vea Establecer 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, vea Sintaxis de intervalo de direcciones y 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 De pasos, use bl (Lista de puntos de interrupción).

El contador Pases solo se reduce 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 está recorriendo el código o el seguimiento pasado. Cuando el contador Pases alcanza 1, solo puede restablecerlo desactivando 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 de CommandString pueden incluir parámetros. Puede usar caracteres de control C estándar (como \n y \"). Los signos de punto y coma contenidos en comillas de segundo nivel (\") se interpretan como parte de la cadena entre comillas incrustadas.

Los comandos CommandString solo se ejecutan si se alcanza el punto de interrupción mientras se ejecuta la aplicación en respuesta a un comando g (Go). Los comandos no se ejecutan si recorre el código o el seguimiento pasado 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
Targets Solo depuración activa
Plataformas todo

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 para controlar puntos de interrupción y cómo establecer puntos de interrupción en el espacio de usuario desde un depurador de kernel, vea Using Breakpoints. Para obtener más información sobre los puntos de interrupción condicionales, vea Establecer 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 se descarga el módulo.

  • 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 (bu Puntos de interrupción).

  • 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 al 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 descargas y cargas 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 se quieren usar caracteres comodín en el patrón de símbolos para un punto de interrupción. La sintaxis bmSymbolPattern 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ñar 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 un punto de interrupción de software se coloca en datos de programa en lugar de 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 (Break on Access) en su lugar. Para obtener más información, vea 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 contiene caracteres restringidos en caso contrario, 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 el 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 después del principio de la función MyTest. Este punto de interrupción se omite para los seis primeros pasos por el 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 el punto de interrupción se creó mediante bm 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 ;