Puntos de interrupción del procesador (puntos de interrupción ba)
Los puntos de interrupción controlados por el procesador a petición del depurador se conocen como puntos de interrupción del procesador o puntos de interrupción de datos. Los puntos de interrupción controlados directamente por el depurador se conocen como puntos de interrupción de software.
Nota Aunque el término punto de interrupción de datos se usa normalmente como sinónimo de punto de interrupción del procesador, este término puede ser engañoso. Hay dos tipos fundamentales de puntos de interrupción: puntos de interrupción del procesador, controlados por el procesador y puntos de interrupción de software, que el depurador controla. Normalmente, los puntos de interrupción del procesador se establecen en los datos del programa, por eso se llaman "puntos de interrupción de datos", pero también se pueden establecer en el código ejecutable. Normalmente, los puntos de interrupción de software se establecen en el código ejecutable, pero también se pueden establecer en los datos del programa. Desafortunadamente, es habitual en la literatura de depuración hacer referencia a los puntos de interrupción del procesador como "puntos de interrupción de datos", incluso cuando se establecen en código ejecutable.
Puntos de interrupción del procesador
Se desencadena un punto de interrupción del procesador cuando se accede a una ubicación de memoria específica. Hay cuatro tipos de puntos de interrupción del procesador, correspondientes al tipo de acceso a memoria que lo desencadena:
Tipo de punto de interrupción | Action |
---|---|
e (ejecutar) | Se desencadena cuando el procesador recupera una instrucción de la dirección especificada. |
r (lectura/escritura) | Se desencadena cuando el procesador lee o escribe memoria en la dirección especificada. |
w (escritura) | Se desencadena cuando el procesador escribe memoria en la dirección especificada. |
i (e/s) | Se desencadena cuando se accede al puerto de E/S en la dirección especificada. |
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 el ejemplo indicado en el párrafo anterior, 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. Para obtener más información sobre cómo se controla esta situación en un procesador específico, consulte el manual de arquitectura del procesador y busque "registro de depuración" o "registro de control de depuración". Tomando un tipo de procesador específico como 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 el 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.
Puntos de interrupción de software
Los puntos de interrupción de software, a diferencia de los puntos de interrupción del procesador, se controlan mediante el depurador. Cuando el depurador establece un punto de interrupción de software en alguna ubicación, reemplaza temporalmente el contenido de esa ubicación de memoria por una instrucción de interrupción. El depurador recuerda el contenido original de esta ubicación, de modo que, si esta memoria se muestra en el depurador, el depurador mostrará el contenido original de esa ubicación de memoria, no la instrucción de interrupción. Cuando el proceso de destino ejecuta el código en esta ubicación, la instrucción break hace que el proceso irrumpa en el depurador. Después de realizar las acciones que elija, puede hacer que el destino reanude la ejecución y la ejecución se reanudará con la instrucción que se encontraba originalmente en esa ubicación.
Disponibilidad de los tipos de punto de interrupción del procesador
La opción i (i/o) solo está disponible durante la depuración en modo kernel.
No todos los tamaños de datos se pueden usar con todos los tipos de punto de interrupción del procesador. Los tamaños permitidos dependen del procesador del equipo de destino. Para obtener más información, consulte ba (Irrumpir en el acceso).
Limitaciones de los puntos de interrupción de software y los puntos de interrupción del procesador
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. Cuando el depurador coloca un punto de interrupción de software en alguna ubicación, reemplaza temporalmente el contenido de esa ubicación de memoria por una instrucción de interrupción. Esto no daña la imagen ejecutable, ya que el depurador recuerda el contenido original de esta ubicación y cuando el proceso de destino intenta ejecutar este código, el depurador puede responder correctamente. Pero cuando se establece un punto de interrupción de software en una ubicación de datos, la sobrescritura resultante puede provocar daños en los datos. Por lo tanto, establecer un punto de interrupción de software en una ubicación de datos solo es seguro si está seguro de que esta ubicación solo se usará como código ejecutable.
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. Por lo tanto, no se pueden usar en código de solo lectura ni en ningún otro código que no se pueda sobrescribir. Para establecer un punto de interrupción en este código, debe usar ba (Irrumpir en acceso) con la opción e (ejecutar).
No se pueden crear varios puntos de interrupción de procesador en la misma dirección que solo difieran en el comando que se ejecuta automáticamente cuando se activa el punto de interrupción. Sin embargo, puede crear varios puntos de interrupción en la misma dirección que difieren en sus otras restricciones (por ejemplo, puede crear varios puntos de interrupción en la misma dirección mediante el comando ba con valores diferentes de las opciones /p, /t, /c y /C).
El punto de interrupción inicial en un proceso en modo de usuario (normalmente establecido en la función principal o su equivalente) no puede ser un punto de interrupción del procesador.
El número de puntos de interrupción de procesador admitidos depende de la arquitectura del procesador de destino.
Control de los puntos de interrupción de software y puntos de interrupción del procesador
Los puntos de interrupción de software se pueden crear con los comandos bp (Establecer punto de interrupción), bm (Establecer punto de interrupción de símbolos) y bu (Establecer punto de interrupción sin resolver). Los puntos de interrupción del procesador se pueden crear con el comando ba (Irrumpir en acceso). Los comandos que deshabilitan, habilitan y modifican puntos de interrupción se aplican a todos los tipos de puntos de interrupción. Los comandos que muestran una lista de puntos de interrupción incluyen todos los puntos de interrupción e indican el tipo de cada uno. Para obtener una lista de estos comandos, consulte Métodos de control de puntos de interrupción.
El cuadro de diálogo Puntos de interrupción de WinDbg muestra todos los puntos de interrupción, lo que indica puntos de interrupción del procesador con la notación "e", "r", "w" o "i" seguida del tamaño del bloque. Este cuadro de diálogo se puede usar para modificar cualquier punto de interrupción. El cuadro de texto Comando de este cuadro de diálogo se puede usar para crear cualquier tipo de punto de interrupción. Si se desea un punto de interrupción del procesador, comience la entrada con "ba". Al establecer un punto de interrupción mediante el mouse en la ventana Desensamblado de WinDbg o en la ventana Origen, el depurador crea un punto de interrupción de software sin resolver.
Los puntos de interrupción del procesador se almacenan en los registros de depuración del procesador. Es posible establecer un punto de interrupción editando manualmente un valor de registro de depuración, pero esto no se recomienda.