GDB para depurar programas en C/C++ en GNU/Linux

GNU/Linux, Programación 5 Comments

Miremos la descripción de gdb sacada del mismo man:

El proposito de un depurador como GDB es permitir al usuario ver lo que
esta ocurriendo “dentro” de otro programa mientras que se esta ejecu-
tando — o lo que estaba haciendo en el momento que fallo.

GDB puede hacer cuatro tipo de cosas (mas otras cosas para dar soporte
a estas) para ayudarte a capturar errores en el acto:

o Comenzar tu programa, especificando cualquier cosa que pueda
afectar a su comportamiento.

o Hacer que tu programa se pare al cumplirse las condiciones
especificadas.

o Examinar que ha pasado, cuando tu programa se ha parado.

o Cambiar cosas de tu programa, de tal manera que puedas experi-
mentar corrigiendo los efectos de un fallo y continuar para des-
cubrir otros.

Generalmente todas las distribuciones GNU/Linux ya tendrán este depurador instalado o en su defecto, lo encontraran en su administrador de paquetes preferido/formato de paquetes preferido (deb,rpm, etc..).

Me entere del programa entrado al canal de IRC de gentoo en freenode.org, la cuestión es que probaba el proyecto de fin de semestre para “Programación de Sistemas” en Gentoo, como la interfaz gráfica es usando Ncurses no creí que hubiera error alguno y bueno, paso lo que menos me imagine el programa brinco y aborto la ejecución al iniciar la compilación (el proyecto es un “Editor de Textos” para implementar el manejo de un compilador :P ). Entre mi dije, demonios!! yo que creía que todo iba ser miel sobre hojuelas :( , en fin, después de probarlo hace unos minutos me encontré con el error y supe solucionar :D .

Ahora empecemos con la parte práctica que es la más me gusta, para compilar un código con información útil para gdb hay que hacerlo de la siguiente manera (opción: –ggdb):

g++ [nombre].cpp -lncurses -ggdb -o [nombre_binario]

Para iniciar gdb con el binario es tan simple como poner el comando con el mismo nombre y el ejecutable a depurar:

Se puede ejecutar gdb sin argumentos ni opciones; pero la manera mas
comun de comenzar GDB es con uno o dos argumentos, especificando un
programa ejecutable con el argumento:

gdb programa

soullost@UnderHouse ~/c++/curses/editor $ gdb [nombre_binario]
GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb)

Aquí empieza lo interesante.

Poner un breakpoint (lugar donde se detendrá el programa en ejecución para hacer acciones de depuración):

break [fichero:]funcion
Pone un punto de ruptura en funcion (en fichero).

(gdb) break separar
Breakpoint 1 at 0x804ad44

Para iniciar la ejecución de programa:

run [arglist]
Comienza tu programa (con arglist, si se especifica).

(gdb) run

Si establecimos un breakpoint, se detiene el programa y posteriormente después de realizar algunas acciones (como mirar valor de variables, adelantar unas líneas, etc..) queremos que el programa se siga ejecutando normalmente hacemos:

c Continua ejecutando tu programa (despues de parar, p.e. en un
punto de ruptura).

 (gdb) c 

Para mirar la pila de los eventos guardados por gdb:

bt Backtrace: muestra la pila del programa.

(gdb) bt
#0  0xffffe410 in __kernel_vsyscall ()
#1  0xb7cb7101 in raise () from /lib/libc.so.6
#2  0xb7cb88e8 in abort () from /lib/libc.so.6
#3  0xb7cedcbb in __libc_message () from /lib/libc.so.6
#4  0xb7cf3a00 in malloc_printerr () from /lib/libc.so.6
#5  0xb7cf56f9 in free () from /lib/libc.so.6
#6  0x08049bd8 in analizadorLexico ()
#7  0x0804ae76 in separar ()
#8  0x0804c727 in main ()

En este caso nos menciona más o menos lo siguiente:

#2 Abortado
#3 Aviso Error
#4 Aviso Error
#5 Ejecución de la función free()
#6 Entra a analizadorLexico()
#7 Entra a separar()
#8 Entra a main

Ya nos dijo que el error existe después de llamar a free(), para asegurarnos ejecutamos nuevamente el programa con las opciones next y step:

next. Nos dice en que línea va ejecutando el programa pero con un peculiaridad, si existe la llamada a una función simplemente la ejecuta y continua con la línea posterior después de la llamada a la función.

step. Lo mismo que lo anterior pero este si entra a la función y no simplemente la ejecuta, por lo que si se topa con alguna, entrará a la función y se ejecutará paso a paso desde la primera línea y al terminar regresará al punto donde fue llamada la función para continuar.

Ejemplo, continuando con la depuración del editor que nos causaba problemas:

(gdb) next
660                     while(ptrToken){
(gdb) next
661                             strcpy(tokens[z].nombre,ptrToken);
(gdb) next
662                             tokens[z].linea=i;
(gdb) next
663                             z++;
(gdb) next
664                             ptrToken = strtok(NULL," ");
(gdb) next
660                     while(ptrToken){

Cuando se usa step y pasa a ejecutar una función paso a paso.

(gdb) step
analizadorLexico (token=0x804f7a0 "inicio", linea=0) at main.cpp:702
702             int w=0;

Si en algunas casos queremos mirar el valor de alguna variable podemos usar print:

print expr
Muestra el valor de una expresion.

(gdb) print tokens[i]
$1 = {nombre = "inicio\000\000\000", linea = 0}

Y bueno, es algo básico que me ayudó a mirar el error que provocaba que el programa abortara la ejecución, el error tuvo que ver con la llamada a free() y que con comentarlo bastó para solucionarse :shock: y fue bastante raro porque en Dev C++ no provoco error alguno y el programa en windows corre bien.

Corriendo el programa en gnome-terminal :D

Editor

Si están interesados en más información sobre gdb pueden mirar:
man gdb (consola)
info gdb (consola)
http://www.ldc.usb.ve/~figueira/Cursos/ci3825/taller/material/gdb.html
http://www.ac.uma.es/educacion/cursos/informatica/FundSistOp/gdb.pdf

Hay bastante más información en google :P , nos vemos ;) .

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

Lugares secretos de la tierra

General 1 Comment

Algunos lugares interesantes vistos con google earth :D

saludos

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

cosas, etc

Diseño Gráfico 4 Comments

xD ps les enseño lo que he hecho en mi curso de manualidades :), nah mentira U_U, en la uni XDD =)

cuadro de texturas

este es un cuadro de texturas =>, basado en el cuadro llamado Der Kuss, del pintor Gustav Klimt

Titere

este cuadro u_u, no se, es pequeño, y me inspire creo del opening de elfen lied, aunque no parece mucho xD bah no se

escultura guitarrista escultura guitarrista

esa es la dichosa escultura a partit de un cubo ¬¬, me dolian las manos y espalda, y la pintada me quedo medio fea xD, asi que la pintare de nuevo

chico de plastilina

por ultimo el chico de plastilina T_T, ahh siempre se desmembraba, XD en el camion se le caia la cabeza y los brazos *_*, medio lo arme de nuevo, pero ahora ya solo es una bola de plastilina cafe xD

y ps eso es todo :P
solo el martes otro examen y me olvido de este semestre n_n
saludos

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5 out of 5)
Loading ... Loading ...

Robot tocando violín presentado por TOYOTA

General 2 Comments

En la mañana antes de salir a la universidad veía las noticias por la tv y pasaba un reportaje sobre un robot presentado recientemente por TOYOTA que tocaba el violín :o , me quedé un rato más viendo como si tocaba y no se escucha tan mal xD…

El vídeo acá:

Artículo:

Un robot que toca el violín

CIUDAD DE MÉXICO (CNNExpansión.com) — Se le puede comparar con un virtuoso de la música, sólo que sus herramientas son robóticas. El nuevo robot de Toyota toca muy bien la canción “Pompa y circunstancia” en el violín.

El robot blanco de 152 centímetros de alto, presentado este jueves, usas sus dedos mecánicos para presionar las cuerdas correctamente y tocar como un humano.

Toyota ya ha mostrado robots que circulan por las oficinas como guías y que pueden tocar la trompeta.

Link: http://www.cnnexpansion.com/tecnologia/2007/12/06/un-robot-que-toca-el-violin

Además presentaron otro que le hace de recepcionista, da bienvenidas, presenta la empresa, da un recorrido, etc.. Impresionante como a crecido el área de IA últimamente :) .

Nos vemos..

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Msn dentro de la barra lateral de Firefox

General 2 Comments

Mozilla Firefox

Hoy andaba buscando un mensajero online, que aunque no pude usarlo en la escuela xD, pero ahi buscando vi que podias tener un mensajero en la util barra lateral de firefox =). Asi que no perdi la oportunidad de ver que tal estaba :$

Para empezar traia el firefox portable en la usb :D, ya de ahi abri la pagina de eBuddy MSN, y le das en marcadores>añadir esta página a marcadores.

De ahi para tenerlo en la barra lateral solo busca la pagina en los marcadores, le das clic en propiedades, y habilitas el recuadro que dice “cargar este marcador en la barra lateral”. ejemplo…

De ahi lo unico que tienes que hacer es abrir el marcador e iniciar tu sesion xD sin miedo de que el msn del cibercafé este truqueado… espero que sea util :P

ebuddy1.JPG

en lo particular me gusta mas como se ve este que el webmessenger XD que ese si es como una mentada de madre, igual y ya lo cambiaron… pero ps yo que se xD

ebuddy2.JPG

Aplicaciones Portatiles

Mas mensajeros en Linea:
meebo
msn webmessenger
iloveim
msn2go
messengerfx

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

« Previous Entries Next Entries »