Red de conocimiento informático - Material del sitio web - Cómo utilizar gdb para depurar un proceso en ejecución

Cómo utilizar gdb para depurar un proceso en ejecución

Paso 1 Compile un programa de bucle infinito.

/* Nombre de archivo malloc.c*/

#include lt; stdio.hgt

#include lt;

#include lt;string.hgt;

void getmem(void **p, int num){

*p = (void *)malloc(num);

}

prueba nula(void){

char *str = NULL;

getmem((void **)amp.str , 100);

strcpy(cadena, "Hola");

printf("s\n", cadena

}

int main(void){

int i = 0;

while(1){

si (i == 1){

prueba();

devuelve 1

}

}

devuelve 0; p>}

Podemos ver que este programa asigna una parte de la memoria para que la use strcpy. No incluí una declaración correcta sobre strcpy en el programa de prueba.

La salida normal de la función es i==1, pero el programa simplemente no puede mantener i==1 sin cambios. El valor de la variable i se utilizará cuando se utilice gdb.

Iniciar compilación

$gcc -g malloc.c

Debes usar gdb y aún necesitas usar -g. El ejecutable resultante es a.out

Paso 2 Deje que gdb se conecte al proceso en ejecución

Primero ejecute el programa.

$./a.out

Obviamente, este es un bucle infinito.

Vuelva a abrir el shell

$ps -u

Mi máquina está funcionando de la siguiente manera:

Advertencia: error de sintaxis de ps, puede deberse Falso"-"? Ver comando "i=1": .

(gdb) i=1

Comando de información no definido: "=1".

(gdb) set i=1

Comando de configuración difusa "i=1": .

(gdb) set var i=1

(gdb) l

14 }

15

16 int principal(vacío){

17 int i = 0 ;

18 mientras(1){

19 si (i == 1){

20 prueba();

21 devolver 1;

22 }

23 }

(gdb) n

20 prueba();

(gdb)

21 devolver 1

(gdb)

25 }

(gdb)

0xb7f47775 en __libc_start_main () de /lib/tls/i686/cmov/libc.so.6

(gdb)

Haga clic en el paso hasta salir de la función __libc_start_main,

Esta función no tiene información de número de línea.

El programa salió con el código 01. Puede considerar ejecutar el comando ./a.out shell hasta la línea 20 y debería ver la cadena de saludo en la salida estándar. Cuando gdb muestra que el proceso salió, ./a.out shell debería haber finalizado el proceso.

Utilice set var i=1 en gdb para modificar el valor de la variable i (el comando set i=1 no se puede reconocer) para que el programa pueda salir normalmente.

Al depurar, todas las bibliotecas llamadas por el programa actual también saldrán.

Ejemplo de lectura de símbolos de /home/wyc/desktop/my_program/review/a.out....done.

De /lib/tls/i686/cmov /libc .so.6... Símbolos cargados para /lib/tls/i686/cmov/libc.so.6

Leyendo símbolos de /lib/ld-linux.so.2... (sin depuración) símbolos encontrados...).(no se encontraron símbolos de depuración).... hecho.

Símbolos cargados para /lib/ld-linux.so.2

Este es un lista de todas las bibliotecas llamadas por el programa a.out. Puede utilizar este método para analizar las llamadas a la biblioteca del programa que se está ejecutando actualmente.

Nunca cierre gdb, el siguiente efecto de depuración será mejor:

Paso 3 Reinicie el programa en gdb

En el ejemplo anterior, ya sabemos que el programa se cierra normalmente, pero gdb aún no se ha cerrado. ¿Cuál será el efecto de ejecutarlo en gdb en este momento?

(gdb) ejecutar

Programa inicial:/home/wyc/desktop/my_program/review/a.out

Aquí hay un callejón sin salida...

Reemplace Ctrl c y envíe la señal SIGINT a gdb.

^C

El programa recibió la señal SIGINT, Interrupción.

main () en malloc.c: 19

19 if ( i == 1){

(gdb) p i

$2 = 0

(gdb) establecer var i=1

( gdb) n

20 prueba();

(gdb) n

Hola

21 devuelve 1;

(gdb) n

25 }

(gdb) n

0xb7e7b775 en __libc_start_main () de /lib/tls/i686/cmov/libc . so.6

(gdb) n

Un solo paso hasta que salga la función __libc_start _main,

Esta función no tiene información de número de línea.

El programa salió con el código 01.

Como puede ver, después de conectarse al proceso con gdb, encontrará todos los archivos necesarios para ejecutar el proceso y, después de cerrar el proceso actual, aún podrá iniciar el programa en gdb para iniciar esto. programa.

Tengo que admirar las poderosas capacidades de depuración de GDB

Dependiendo de si se analiza el programa, existen otros comandos en gdb, como los siguientes comandos simples:

Bt, p, p/x, setp, registros de información, break, jump...