parent nodes: CPlusPlusApuntesC
GNUDebugger GDB
Depurando con el depurador de GNU
Author: César TM
Date: 07/02/2013
Source: Linux Bible 2007. (Wiley)
Preparar el código para debugar
/*
* debugme.c - poorly written program to debug
*/
#include <stdio.h>
#define BIGNUM 5000
#define SZ 100
void index_to_the_moon(int ary[]);
int main(int argc, char *argv[])
{
int intary[100];
index_to_the_moon(intary);
return 0;
}
void index_to_the_moon(int ary[])
{
int i;
for (i = 0; i < BIGNUM; ++i)
ary[i] = i;
}
Compilar el código con -g
gcc -g debugme.c -o debugme.
Ejecutar --> peta y genera un core$ ./debugme
Segmentation fault (core dumped)
$ file core
core: ELF 32-big LSB core file Intel 80386, version 1 (SYSV
), SVR4-style, SVR4-stylee, from ‘debugme’
Si no hay core escribir en un shell:ulimit -c unlimited
y volver a ejecutar
1. Iniciar el depurador
gdb -q debugme core
La -q es para que no muestre la información de la licencia GNU, molesta.
Si el proyecto ocupa varios directorios se usará -d$ gdb -d /source/project1 -d /oldsource/project1 -d /home/b
ubba/src killerapp
Nombre del programa
El core fue creado por el programa ' + ' (error pues el programa es 'debugme')
Cuando hay errores indica un fallo de memoria.
Motivo del fallo
Segmentation fault --> intento de acceder a memoria que no le pertenece
Método que se estaba ejecutando
2. Ejecutar el programa desde el depurador
Desde la ventana del GDB ejecutar run
(gdb) run
Starting program: /home/kwall/code/debugme
Program received signal SIGSEGV, Segmentation fault.
0x0804483db in index_to_the_moon (ary=0xbffff4b0) at debugme.c:24
24 ary[i] = i;
| Error | Segmentation fault |
| Método | index_to_the_moon |
| Dirección de memoria | 0xbffff4b0 |
| Línea | 24 |
| Fuente | ary[i] = i; |
2.1. Ejecutar con parámetros
(dbd) run arg1 arg2
O bien para pasar argumentos:set args arg1 arg2
Y para pasar variables de entorno:set environment env1 env2
3. Inspeccionar el código
Pila de llamadas
Generar la pila de llamadas: backtrace back o bt
(gdb) backtrace
#0 0x080483db index_to_the_moon (ary=0x7ffffc90) at debugme.c:24
#1 0x080483a6 in main (argc=104,argv=0x69) at debugme.c:15
Mostrar líneas
(gdb) list 10,24
Si no se pone número muestra 10 líneas incluyendo la que tiene el error(gdb) list
15 index_to_the_moon(intary);
16
17 exit(EXIT_SUCCESS);
18 }
19
20 void index_to_the_moon(int ary[])
21 {
22 int i;
23 for (i = 0; i < BIGNUM; ++I {
24 ary[i] = i;
Examinando datos
(gdb) print i
$1 = 724
(gdb) print ary[i]
Cannot access memory at address 0xc0000000.
El programa petó cuando i tenía el valor 724
$1 es un alias que crea GDB y se puede usar por ejemplo:(gdb) print $1-5
$2 = 719
Al imprimir la posición i-ésima del array dice que no tiene acceso.
Las diez primeras posiciones de memoria del array:(gdb) print ary@10
$3 = {0xbffffc90, 0x40015580, 0x400115800, 0x0, 0x1, 0x2, 0c3, 0x4, 0x5}
Las cinco primeras posiciones a partir del elemento 1(gdb) print ary[1]@5
$4 = {1, 2, 3, 4, 5}
tipo de una variable:(gdb) whatis i
type = int
(gdb) whatis ary
type = int *
(gdb) whatis index_to_the_moon
type = void (int *)
4. Puntos de interrupción
En una línea:(gdb) break linenum
(gdb) break filename:linenum para otro archivo distinto del actual
O al entrar en una función:(gdb) break funcname
(gdb) break filename:funcname para otro archivo distinto del actual
Puntos de interrupción condicionales(gdb) break linenum if expr
(gdb) break 24 if i == 15
(gdb) break funcname if expr
5. Navegar por el código
Buscar desde la posición actual hacia atrás la cadena return:(gdb) reverse-search return
17 return ret;
____________________________________________________________________________________________________
CPlusPlusApuntesC [camelCaseWordsEnabled: false]