Debug ETN-701

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 7

DEBUG

"Bug" significa fallo, defecto en un programa; "debug" significa depurar (escrutar y


eliminar fallos), "Debugger" (depurador).

Un depurador (en inglés: debugger) es un programa usado para probar


y depurar (eliminar) los errores de otros programas (el programa "objetivo"). El código
a ser examinado puede alternativamente estar corriendo en un simulador de conjunto de
instrucciones (ISS), una técnica que permite gran potencia en su capacidad de detenerse
cuando son encontradas condiciones específicas pero será típicamente algo más lento
que ejecutando el código directamente en el apropiado (o el mismo) procesador.
Algunos depuradores ofrecen dos modos de operación - la simulación parcial o
completa, para limitar este impacto.
Si es un depurador de nivel de fuente o depurador simbólico, comúnmente ahora visto
en entornos de desarrollo integrados, cuando el programa "se estrella" o alcanza una
condición predefinida, la depuración típicamente muestra la posición en el código
original. Si es un depurador de bajo nivel o un depurador de lenguaje de máquina,
muestra la línea en el fuente desensamblado (a menos que también tenga acceso en línea
al código fuente original y pueda exhibir la sección apropiada del código
del ensamblador o del compilador). Un "estrellamiento" sucede cuando el programa no
puede continuar normalmente debido a un error de programación. Por ejemplo, el
programa pudo haber intentado usar una instrucción no disponible en la versión actual
del CPU o haber intentado tener acceso a memoria protegida o no disponible.

Sinopsis

DEBUG.EXE es un ejecutable de las versiones de MS-DOS, a partir de la 2.0, y de


Windows. Se trata de una utilidad interactiva de exploración de bajo nivel, pero que
también puede utilizarse para ciertas funciones. Por ejemplo: ensamblador a lenguaje
máquina. Para utilizarlo basta invocarlo desde MS-DOS o desde una ventana DOS de
Windows.

Opciones

Una vez que el programa está en ejecución, el indicador ("prompt") es un guión "-",
indicando que el "Shell" espera recibir órdenes. La opción más sencilla es la
interrogación ?, cuyo resultado es una lista resumida de las opciones disponibles:

ensamblar A [dirección]
comparar C dirección de intervalo
volcar D [intervalo]
escribir E dirección [lista de valores]
llenar F lista de intervalos
ir G [=dirección] [direcciones]
hex H valor1 valor2
entrada I puerto
cargar L [dirección] [unidad] [primer_sector] [número]
mover M dirección de intervalo
nombre N [nombre_ruta] [lista_argumentos]
salida O byte de puerto
proceder P [=dirección] [número]
salir Q
registrar R [registrar]
buscar S lista de intervalos
seguimiento T [=dirección] [valor]
desensamblar U [intervalo]
escribir W [dirección] [unidad] [primer_sector] [número]
asignar memoria expandida XA [#páginas]
desasignar memoria expandida XD [identificador]
asignar páginas de memoria expandida XM [Lpágina] [Ppágina] [identificador]
mostrar estado de la memoria expandida XS

La mayoría de los comandos de debug ejecutan una acción y vuelven al indicador del
shell, pero si es un comando largo, como puede ser mostrar un trozo grande de código,
puede detenerse pulsando CTRL-Pausa o interrumpirse con CTRL-C para volver al
shell.

Errores

Cuando debug no sabe interpretar un comando, muestra un mensaje de error y un


indicador "^" debajo del sitio del comando donde está el error.

Comandos

El comando 'H': la instrucción "H <op_1> <op_2>" devuelve la suma y la resta


(en hexadecimal) de los dos operandos suministrados.

Donde op1 y op2 significan operandos.

Parámetros: 2 números hexadecimales de 4 dígitos (máximo)

Resultado:

<resultado_1>; Es la suma (<op_1> + <op_2>)

<resultado_2>; es la resta (<op_1> - <op_2>)

Ejemplo:
-h 0003 0002
0005 0001
-h 0000 0001
0001 FFFF,

Como se observa el resultado de la segunda operación es FFFF, que es el equivalente en


complemento a 2 de -1

El comando 'R': muestra o modifica registros

Parámetros: [registro]

Resultado: Si especificamos un registro, DEBUG nos permite modificar el contenido de


ese registro, si no lo hemos especificado, presenta por pantalla el contenido de los
registros principales del procesador, además muestra la instrucción apuntada por CS:IP

Registro de flags:

NV UP EI PL NZ NA PO NC

Desbordamiento
Poner: OV Quitar: NV

Dirección (reducción/incremento)
poner: DN quitar UP

Interrupción (activar/desactivar)
poner: EI quitar: DI

Signo (negativo / positivo)


poner: NG quitar: PL
Cero ( sí / no)
poner: ZR quitar: NZ

Acarrero Auxiliar ( sí / no )
poner: AC quitar: NA

Paridad ( par / impar )


poner: PE quitar: PO

Acarreo (sí / no )
poner: CY quitar: NC

Ejemplo 1:

-r
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC
2048:0100 92 XCHG DX,AX

Ejemplo 2:

-r ax
AX 0000
:01
-r
AX=0001 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=2048 ES=2048 SS=2048 CS=2048 IP=0100 NV UP EI PL NZ NA PO NC
2048:0100 92 XCHG DX,AX

El comando 'E' ( escribir en memoria )

Parámetros: <dir_comienzo> [lista de palabras a escribir]

Resultados: Se escribe a partir de la dirección de memoria DS:<dir_comienzo> la lista


de palabras (dos dígitos hexadecimales) del segundo parámetro. Si no se especifica un
segundo parámetro entonces DEBUG no permite introducir palabra a palabra los datos
que queramos, a partir de la dirección DS:<dir_comienzo>. Podemos pasar a la palabra
siguiente de memoria presionando la tecla ESPACIO, cuando hayamos terminado de
introducir los datos que queramos, hay que pulsar INTRO

Ejemplo:

-E 100

2048:0100 56.

El Comando 'T': traza o ejecuta paso a paso)


Parámetros: [< =dirección>]; Dirección a partir de la cual se quiere que se trace (OJO:
HAY QUE PONER EL '=' ) <num_instrucciones> ; Número de instrucciones que hay
que ejecutar

Resultados: se ejecutan las <NUM_instrucciones> instrucciones a partir de


CS:<direccion> ( si se ha especificado <direccion> ) o se ejecutan
<NUM_instrucciones> a partir de CS:IP, si no se especifica el parámetro
<NUM_instrucciones> se ejecuta una única instrucción

Ejemplo:

El Comando 'Q': Salir de debug

Para poder salir del programa es introduciendo el comando 'Q'

PROGRAMANDO LENGUAJE ENSAMBLADOR CON


MS-DOS DEBUG
Iniciaremos debug desde la aplicación COMMAND:

C:\>debug (enter)
-

Ahora insertamos las instruccionesm usando el comando interno Assembly (a), solo
tecleamos la letra 'a' y luego enter:

-a (enter)
0D1B:0100

debug nos presenta un guión en el prompt y nos indica que nuestro programa inicia en
la dirección 100; ahora cada instrucción incrementará este valor ala localidad siguiente.
Cada instrucción debemos teclear (enter).

0D1B:0100 mov ah,9


0D1B:0102 mov dx,200
0D1B:0105 int 21
0D1B:0107 int 20
0D1B:0109

Nuestro programa tiene 9 bytes de longitud (desde la dirección 100 hasta 108
inclusive); en la última línea pulsa enter para volver al prompt; despues de codificar el
programa queremos escribir algunos caracteres directo en memoria a partir dela
localidad 109 (justo donde termina nuestro programa en la dirección 108); Usaremos el
comando Edit (e), teclea 'e' seguido de la dirección de memoria que queremos editar.

-e ds:109 'ciao$'

Acabamos de insertar una linea de texto en la dirección 109. el simbolo de $ al final es


la secuencia de escape para indicar Fin de la linea. Para listar nuestro programa
completo usaremos el cmando Unassemble o sea Desensamblar (u), entonces
escribimos ucs:100 y enter:

-u cs:100
0D1B:0100 B409 MOV AH,09 ; usaremos la funcion 9 de la int 21 para mandar
imprimir una cadena de texto.
0D1B:0102 BA0901 MOV DX,0109 ; ponemos la dirección de la cadena en el
registro dx
0D1B:0105 CD21 INT 21 ; llamamos la int 21
0D1B:0107 CD20 INT 20 ; FIN DE PROGRAMA
0D1B:0109 63 DB 63 ; 'h'
0D1B:010A 69 DB 69 ; 'o'
0D1B:010B 61 DB 61 ; 'l'
0D1B:010C 6F DB 6F ; 'a'
0D1B:010D 2419 AND AL,19 ; '$'

Ahora observemos la memoria usando un dump hexadecimal; tecleamos el


comando Dump (d) seguido de la dirección a partir de la cual hacemos
el dump (volcado); en el dump podemos reconocer los mismos bytes que teniamos en el
listado pero en otro formato de lista corta.

-dds:100
0D1B:0100 B4 09 BA 09 01 CD 21 CD-20 63 69 61 6F 24 19 4D ......!. ciao$.M
0D1B:0110 53 2D 00 00 00 20 56 65-72 73 69 6F 34 00 0A 0D S-....Versio4...

Ahora guardemos nuestro programa enun archivo llamado test.com; debemos insertar
el nombre del archivo, el tamaño del programa y usar el comando Write (w); el tamaño
del programa es 14 bytes (cuentalos!) que se escribe 0E en hexadecimal

-rcx (enter)
CX 0000
:e (enter)
-ntest.com (enter)
-w (enter)
Writing 0000E bytes
-

Listo! hemos terminado salimos de debug tecleando 'q' y podemos tratr de correr el
programa

-q

Ejecutemos el programa!!!

C:\>test (enter)
hola

También podría gustarte