Depuración en modo de ensamblado

Si tiene archivos de código fuente de C o C++ para la aplicación, puede usar el depurador de forma mucho más eficaz si depura en modo de origen.

Sin embargo, hay muchas veces que no se puede realizar la depuración de origen. Es posible que no tenga los archivos de origen de la aplicación. Es posible que esté depurando el código de otra persona. Es posible que no haya compilado los archivos ejecutables con símbolos .pdb completos. E incluso si puede realizar la depuración de origen en la aplicación, es posible que tenga que realizar un seguimiento de las rutinas de Microsoft Windows a las que llama la aplicación o que se usan para cargar la aplicación.

En estas situaciones, debe depurar en modo de ensamblado. Además, el modo de ensamblado tiene muchas características útiles que no están presentes en la depuración de origen. El depurador muestra automáticamente el contenido de las ubicaciones de memoria y se registra a medida que se accede a ellos y muestra la dirección del contador del programa. Esta pantalla hace que la depuración de ensamblados sea una herramienta valiosa que puede usar junto con la depuración de origen.

Código de desensamblado

El depurador analiza principalmente el código ejecutable binario. En lugar de mostrar este código en formato sin formato, el depurador desensambla este código. Es decir, el depurador convierte el código del lenguaje de la máquina en el lenguaje de ensamblado.

Puede mostrar el código resultante (conocido como código de desensamblado) de varias maneras diferentes:

  • El comando u (Unassemble) desensambla y muestra una sección especificada del lenguaje de la máquina.

  • El comando uf (Función unassemble) desensambla y muestra una función.

  • El comando Up (Unassemble from Physical Memory) desensamblado y muestra una sección especificada del lenguaje de la máquina que se ha almacenado en memoria física.

  • El comando (BIOS en modo real sin ensamblar) desensambla y muestra un código en modo real de 16 bits especificado.

  • El comando ux (Unassemble x86 BIOS) desensambla y muestra el conjunto de instrucciones de código bios basado en x86 en una dirección especificada.

  • (Solo WinDbg) La ventana de desensamblado desensamblado y muestra una sección especificada del lenguaje de máquina. esta ventana se activa automáticamente si selecciona el comando de desensamblado abierto automáticamente en el menú de la ventana . También puede abrir esta ventana seleccionando desensamblado en el menú vista, presionando alt+7 o presionando el botón de desensamblado (alt+7).

La pantalla de desensamblado aparece en cuatro columnas: desplazamiento de direcciones, código binario, mnemonic del lenguaje de ensamblado y detalles del lenguaje de ensamblado. En el ejemplo siguiente se muestra esta pantalla.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

A la derecha de la línea que representa el contador de programa actual, la pantalla muestra los valores de cualquier ubicación de memoria o registros a los que se accede. Si esta línea contiene una instrucción de rama, aparecerá la notación [br=1] o [br=0]. Esta notación indica una rama que es o no se toma, respectivamente.

Puede usar el comando .asm (Cambiar opciones de desensamblado) para cambiar cómo se muestran las instrucciones desensamblado.

En la ventana Desensamblado de WinDbg, la línea que representa el contador de programa actual está resaltado. También se resaltan las líneas en las que se establecen puntos de interrupción.

También puede usar los siguientes comandos para manipular el código de ensamblado:

  • El comando # (Buscar patrón de desensamblado) busca en una región de memoria un patrón específico. Este comando equivale a buscar en las cuatro columnas de la pantalla de desensamblado.

  • El comando a (Ensamblado) puede tomar instrucciones de ensamblado y traducirlos en código de máquina binaria.

Modo de ensamblado y modo de origen

El depurador tiene dos modos operativos diferentes: modo de ensamblado y modo de origen.

Cuando se realiza una sola ejecución paso a paso por una aplicación, el tamaño de un solo paso es una línea de código de ensamblado o una línea de código fuente, en función del modo.

Varios comandos crean diferentes pantallas de datos en función del modo.

En WinDbg, la ventana Desensamblado se mueve automáticamente al primer plano al ejecutar o recorrer una aplicación en modo de ensamblado. En el modo de origen, la ventana Origen se mueve al primer plano.

Para establecer el modo, puede realizar una de las siguientes acciones:

  • Use el comando l+, l- (Establecer opciones de origen) para controlar el modo. El comando l-t activa el modo de ensamblado.

  • (Solo WinDbg) Desactive el comando Modo de origen en el menú Depurar para que el depurador entre en modo de ensamblado. También puede seleccionar el botón Modo de origen desactivado en la barra de herramientas.

En WinDbg, cuando se encuentra en modo de ensamblado, ASM aparece visible en la barra de estado.

El menú contextual de la ventana Desensamblado de WinDbg incluye las instrucciones resaltadas del comando de línea de origen actual . Este comando resalta todas las instrucciones que corresponden a la línea de origen actual. Con frecuencia, una sola línea de origen corresponde a varias instrucciones de ensamblado. Si el código se ha optimizado, es posible que estas instrucciones de ensamblado no sean consecutivas. Las instrucciones resaltadas del comando de línea de origen actual le permiten encontrar todas las instrucciones que se ensamblaron desde la línea de origen actual.

Archivos de origen del lenguaje de ensamblado

Si la aplicación se escribió en el lenguaje de ensamblado, el desensamblado que genera el depurador podría no coincidir exactamente con el código original. En concreto, NO-OPs y comentarios no estarán presentes.

Si desea depurar el código haciendo referencia a los archivos .asm originales, debe usar la depuración del modo de origen. Puede cargar el archivo de ensamblado como un archivo de origen de C o C++. Para obtener más información sobre este tipo de depuración, vea Depuración en modo de origen.