User Tag List

Resultados 1 al 9 de 9

Tema: Mi programa unas veces funciona y otras no

  1. #1

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts

    Question Mi programa unas veces funciona y otras no

    Hola a todos,

    estoy haciendo un pequeño programa en C y SDL y tengo un error que me tiene desconcertado. El mismo programa unas veces se ejecuta bien y otras me peta y saca esta traza:

    Código:
    Comienzo del programa
    *** glibc detected *** ./MicroPaint.sh: double free or corruption (out): 0x08089458 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e39a85]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7e3d4f0]
    /usr/lib/libX11.so.6(XkbFreeClientMap+0xe4)[0xb79d87e4]
    /usr/lib/libX11.so.6(XkbFreeKeyboard+0x123)[0xb79dd6b3]
    /usr/lib/libX11.so.6[0xb79d1143]
    /usr/lib/libX11.so.6(_XFreeDisplayStructure+0x11f)[0xb7967c7f]
    /usr/lib/libX11.so.6(XCloseDisplay+0xf6)[0xb7954fc6]
    /usr/lib/libSDL-1.2.so.0[0xb7f58d2e]
    /usr/lib/libSDL-1.2.so.0[0xb7f62bb1]
    /usr/lib/libSDL-1.2.so.0(SDL_VideoQuit+0x50)[0xb7f4de70]
    /usr/lib/libSDL-1.2.so.0(SDL_QuitSubSystem+0x64)[0xb7f23424]
    /usr/lib/libSDL-1.2.so.0(SDL_Quit+0x1e)[0xb7f2349e]
    ./MicroPaint.sh[0x8049a3f]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7de4450]
    ./MicroPaint.sh[0x80487b1]
    ======= Memory map: ========
    08048000-0804a000 r-xp 00000000 08:03 360823     /home/angel/programacion/sdl/MicroPaint/MicroPaint.sh
    0804a000-0804b000 rw-p 00001000 08:03 360823     /home/angel/programacion/sdl/MicroPaint/MicroPaint.sh
    0804b000-0808d000 rw-p 0804b000 00:00 0          [heap]
    b6e19000-b6e23000 r-xp 00000000 08:02 82054      /lib/libgcc_s.so.1
    b6e23000-b6e24000 rw-p 0000a000 08:02 82054      /lib/libgcc_s.so.1
    b6e6f000-b6e70000 ---p b6e6f000 00:00 0 
    b6e70000-b7670000 rw-p b6e70000 00:00 0 
    [.......................................................]
    b7f17000-b7f18000 r--p 00149000 08:02Cancelado
    Bueno pues a ver si alguien sabe a qué se debe. Porque yo entiendo que pueda hacer algo relacionado con las direcciones de memoria, pero no entiendo porqué hay veces que falla y otras que no. Ahora mismo incluso tengo comentado el bucle principal de ejecución del programa, de forma que en todas la ejecuciones se ejecutan las mismas instrucciones.

    Saludos.

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,561
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,668
    Agradecer Thanks Received 
    1,922
    Thanked in
    Agradecido 1,289 veces en [ARG:2 UNDEFINED] posts
    Comprueba que no pierdas memoria y que inicializas las variables correctamente.

    Para encontrar donde esta el error comenta trozos de codigo o usa un depurador, cuando "pete" podras ver donde ha petado y ver el valor de la variables.
    < - >
    Ademas lo dice al principio:
    *** glibc detected *** ./MicroPaint.sh: double free or corruption (out): 0x08089458 ***

    ¿has hecho un free(x) de una variable dos veces?
    Última edición por swapd0; 10/01/2010 a las 16:21 Razón: Edición automática anti doble-post.

  3. #3

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts
    La aplicación contiene paneles y botones anidados, al final del programa se liberan (free()) esos componentes y pudiera ser que eso está mal. Pero he vuelto a probar con el trozo de código que libera la memoria comentado y me pasa lo mismo.

    Voy a intentar aprender a utilizar el GDB a ver que tal.

    Gracias.

  4. #4

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,561
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,668
    Agradecer Thanks Received 
    1,922
    Thanked in
    Agradecido 1,289 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por turco Ver mensaje
    La aplicación contiene paneles y botones anidados, al final del programa se liberan (free()) esos componentes y pudiera ser que eso está mal. Pero he vuelto a probar con el trozo de código que libera la memoria comentado y me pasa lo mismo.

    Voy a intentar aprender a utilizar el GDB a ver que tal.

    Gracias.
    Los paneles y botones los has hecho tu o son de una libreria al estilo wxWidgets, Qt... porque por norma general en todas la librerias cuando creas un boton, panel, combobox... y lo añades a una ventana pertenece a esta, y ya no es necesario borrarlo. Lo borrara la ventana cuando se cierre.

  5. #5

    Fecha de ingreso
    Mar 2007
    Ubicación
    Barna
    Mensajes
    10,341
    Mencionado
    93 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    368
    Agradecer Thanks Received 
    1,791
    Thanked in
    Agradecido 944 veces en [ARG:2 UNDEFINED] posts
    Compila con -g para que al menos te dé la línea que tiene el error.

    Tiene toda la pinta que o bien estás haciendo free() sobre una memoria que no habías reservado, o bien estás haciendo free() dos veces sobre la misma memoria (por ejemplo, tú haces free() sobre alguna variable particular y la librería SDL también lo hace al salir). Para evitar eso tienes que tener un cuidado enorme en los malloc() y free(). Alguna librería como efence o valgrind puede ayudarte a detectar estos errores.

    Puede que unas veces funcione y otras no dependiendo de la zona de memoria sobre la que haces free() Recuerda que en C las variables no se inicializan por defecto, así que tienen valores al azar y por puro azar puede ser que tengan un valor que casualmente sí que puedas liberar, y no te dé error (al menos, no ahí, que seguramente sí que te dé un error misterioso después)

    Además, para facilitarme la vida siempre uso un define tal que así:

    #define FREE(p) if(p!=0){free(p);p=0;}

    Los punteros siempre inicialízalos a 0 y usa FREE() en vez de free().
    Última edición por juanvvc; 10/01/2010 a las 17:08

  6. #6

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts
    Los paneles y botones son una implementación propia en SDL. No he tenido más tiempo de mirar el código, cuando sepa donde estaba el error lo postearé por si sirve de referencia a alguien.
    #define FREE(p) if(p!=0){free(p);p=0;}
    Me lo apunto

  7. #7

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts

    Red face Solucionado

    Bueno antes de nada gracias a todos por vuestras respuestas. He encontrado el fallo y la verdad es algo que seguro que si hubiese puesto el trozo de código cualquiera de vosotros lo habría encontrado nada más verlo, el problema es que no sabía que trozo de código era el que fallaba.

    El problema era que yo estaba haciendo esto:
    Código:
    	if(text != NULL) {
    		boton->text = (char*) malloc(sizeof(char));
    		strcpy(boton->text, text);
    	}
    porque creía que strcpy() reservaba la zona de memoria, y no era así.

    Lo he sustituido por esto otro:
    Código:
    	if(text != NULL) {
    		boton->text = (char*) calloc(strlen(text) + 1, sizeof(char));
    		strcpy(boton->text, text);
    	}
    y ya funcinoa correctamente.

    Espero que por lo menos sirva de referencia a alguien.
    Saludos.

  8. #8

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,561
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,668
    Agradecer Thanks Received 
    1,922
    Thanked in
    Agradecido 1,289 veces en [ARG:2 UNDEFINED] posts
    Pasate al C++ y te ahorras de esos problemas usando la clase std::string.

  9. #9

    Fecha de ingreso
    Jan 2008
    Ubicación
    Sevilla
    Mensajes
    447
    Mencionado
    5 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    106
    Agradecer Thanks Received 
    74
    Thanked in
    Agradecido 23 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por swapd0 Ver mensaje
    Pasate al C++ y te ahorras de esos problemas usando la clase std::string.
    Pues la verdad es que siempre le he estado dando vueltas, pero antes de ponerme con C++ quiero hacer algo en C. Es una espinita que tengo clavada .

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •