Anuncios

Bienvenidos sean a este post, hoy veremos como almacenar los resultados en un archivo.

Anuncios
Anuncios

Hasta el post anterior vimos como depurar nuestros codigos y algunos comandos para interrumpir la ejecucion, ver datos especificos y otros temas mas. Pero cuando tengamos codigos mas grandes, y por ende stack mas grandes o de multithread, se nos dificultara para verlo en la consola. Sin embargo, el depurador nos da la posibilidad de poder enviar toda una sesion o una parte de ella a un texto de archivo, para despues poder manipularlo mas comodamente con una herramienta de edicion de texto. Para ello se utiliza el siguiente comando:

(gdb) set logging enabled on
Anuncios

Esto creara un archivo con el nombre de gdb.txt en el directorio donde se ejecuto gdb. Este comenzara a recibir todos los resultados que vemos en la consola pero no almacenara los comandos ejecutados. Para finalizar solo debemos ejecutar lo siguiente:

(gdb) set logging enabled off
Anuncios

Una ventaja muy importante de trabajar asi, es que podemos usar el logging cada vez que lo necesitemos porque todo nuevo contenido no reemplaza a lo anterrior sino que lo va a agregando al final. Esto mismo ocurre si el archivo ya existe y comenzamos a registrar todo mediante este comando.

Anuncios
Nota:
Esto es para versiones mas modernas, para versiones antiguas deben usar a:
set logging on (activarlo)
set logging off (desactivarlo)

Pueden usarlo con nuevas versiones pero les dara una señal de aviso y sugiriendo los comandos anterioes.
Anuncios

Para verlo en accion, vamos a usar el codigo que utilizamos en el post anterior. Si no lo poseen les dejo el codigo:

#include <iostream>

float sumar(const float*, int);

int main()
{
        float total;
        float x[] = {1,2,3,4,5};
        float y[] = {6,7,8,9,10};
        total = sumar(x, 5);
        printf("sum(x)=%f\n", total);
        total = sumar(y, 5);
        printf("sum(y)=%f\n", total);

        return 0;
}

float sumar(const float* a, int n)
{
        float ret = 0;
        const float* s = a;
        for(int i=0; i < n; i++, s++)
        {
                ret += *s;
        }
        return ret;
}
Anuncios

Deben guardarlo en un archivo, y luego compilarlo pero agregando la opcion -g para agregar todo lo necesario para depurarlo. Con esto realizado, abrimos el programa con el depurador y ejecutemos este comando:

(gdb) set logging enabled on
Anuncios

Con esto activamos al registro de las actividades o logging, y a continuacion ejecutaremos los siguientes comandos:

(gdb) break depurar.cpp:10 // insertamos un breakpoint
Anuncios
(gdb) run // corremos la depuracion
Anuncios
(gdb) watch total // agregamos un watchpoint a esta variable
Anuncios
(gdb) continue // continuamos la ejecucion
Anuncios
(gdb) continue // continuamos la ejecucion
Anuncios
(gdb) continue // continuamos la ejecucion
Anuncios
(gdb) set logging enabled off // finalizamos el registro
Anuncios

Con esto realizado, ya podemos salir del depurador para ver como es el resultado almacenado en el archivo. Veamos como es el resultado almacenado en mi archivo:

Breakpoint 1 at 0x11e3: file depurar.cpp, line 10.
Starting program: /home/tinchicus/lenguajes/cpp/07/depurar
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".

Breakpoint 1, main () at depurar.cpp:10
warning: Source file is more recent than executable.
10              total = sumar(x, 5);
Hardware watchpoint 2: total
Continuing.

Hardware watchpoint 2: total

Old value = 0
New value = 15
main () at depurar.cpp:11
11              printf("sum(x)=%f\n", total);
Continuing.

Hardware watchpoint 2: total

Old value = 15
New value = 40
main () at depurar.cpp:13
13              printf("sum(y)=%f\n", total);
Continuing.

Watchpoint 2 deleted because the program has left the block in
which its expression is valid.
__libc_start_call_main (main=main@entry=0x555555555159 <main()>, argc=argc@entry=1, argv=argv@entry=0x7fffffffe318) at ../sysdeps/nptl/libc_start_call_main.h:74
74      ../sysdeps/nptl/libc_start_call_main.h: No existe el fichero o el directorio.
Continuing.
[Inferior 1 (process 19888) exited normally]
Anuncios

Como pueden ver simplemente son las distintas salidas que fuimos viendo en la consola. Y como mencionamos antes, si este archivo queda en este directorio todo lo que vayamos registrando se agregara al ffinal de este archivo, y con esto completamos la mas utilizado al momento de depurar pero aun nos faltan algunos temas que veremos en los proximos posts.

Anuncios

En resumen, hoy hemos visto como almacenar los resultados devueltos por el depurador, como se activa, como se desactiva, como trabaja y algunas particularidades que nos pueden facilitar nuestras tareas.. Espero les haya resultado de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50