Compartir a través de


Riesgos que conlleva el establecimiento de puntos de interrupción

Al establecer puntos de interrupción especificando una dirección de memoria o un símbolo más un desplazamiento, no debe colocar este punto de interrupción en medio de una instrucción.

Por ejemplo, considere el siguiente código desensamblar.

770000f1 5e               pop     esi
770000f2 5b               pop     ebx
770000f3 c9               leave
770000f4 c21000           ret     0x10
770000f7 837ddc00         cmp     dword ptr [ebp-0x24],0x0

Las tres primeras instrucciones son solo un byte largo. Sin embargo, la cuarta instrucción tiene tres bytes de longitud. (Incluye bytes 0x770000F4, 0x770000F5 y 0x770000F6). Si desea colocar un punto de interrupción en esta instrucción mediante el comando bp, bu o ba , debe especificar la dirección 0x770000F4.

Si coloca un punto de interrupción en la dirección 0x770000F5 mediante el comando ba , el procesador coloca un punto de interrupción en esa ubicación. Pero este punto de interrupción nunca se desencadenaría, ya que el procesador considera 0x770000F4 ser la dirección real de la instrucción.

Si coloca un punto de interrupción en la dirección 0x770000F5 mediante los comandos bp o bu , el depurador escribe un punto de interrupción en esa ubicación. Sin embargo, este punto de interrupción podría dañar el destino debido a cómo el depurador crea puntos de interrupción:

  1. El depurador guarda el contenido de 0x770000F5 y sobrescribe esta memoria con una instrucción de punto de interrupción.

  2. Si intenta mostrar esta memoria en el depurador, el depurador no muestra la instrucción de punto de interrupción que ha escrito. En su lugar, el depurador muestra la memoria que "debe" estar allí. Es decir, el depurador muestra la memoria original o cualquier modificación de esa memoria que haya realizado desde la inserción del punto de interrupción.

  3. Si usa el comando BC para quitar el punto de interrupción, el depurador restaura la memoria original en su ubicación adecuada.

Al colocar un punto de interrupción en 0x770000F5, el depurador guarda este byte y aquí se escribe una instrucción break. Sin embargo, cuando se ejecuta la aplicación, alcanza la dirección 0x770000F4 y reconoce esta dirección como el primer byte de una instrucción multibyte. A continuación, el procesador intenta combinar 0x770000F4, 0x770000F5 y, posiblemente, algunos bytes posteriores en una sola instrucción. Esta combinación puede crear una variedad de comportamientos, ninguno de los cuales es deseable.

Por lo tanto, al colocar puntos de interrupción mediante un comando bp, bu o ba , asegúrese de colocar siempre los puntos de interrupción en la dirección adecuada. Si usa la interfaz gráfica winDbg para agregar puntos de interrupción, no tiene que preocuparse por esta situación porque la dirección correcta se elige automáticamente.

Resolución ambigua del punto de interrupción

En la versión 10.0.25310.1001 y posteriores del motor del depurador, ahora se admite la resolución ambigua del punto de interrupción. Los puntos de interrupción ambiguos permiten al depurador establecer puntos de interrupción en determinados escenarios en los que una expresión de punto de interrupción se resuelve en varias ubicaciones. Para obtener más información, vea Resolución ambigua de puntos de interrupción.

Vea también

Usar puntos de interrupción

Sintaxis de punto de interrupción

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

Resolución ambigua del punto de interrupción

Puntos de interrupción sin resolver (bu Puntos de interrupción)