«Violación de segmento» al ejecutar LineCube.

Consulte acerca de programas, técnicas, algoritmos etc.

«Violación de segmento» al ejecutar LineCube.

Notapor Dokan » Jue May 08, 2008 11:29 am

LineCube es el juego tipo tetris que estamos llevando a cabo en este mismo foro.
Hace cinco días publiqué este mensaje en este foro, porque había conseguido compilar la aplicación (un juego tipo tetris) y luego ejecutarlo. No estaba terminado pero por lo menos se veía la ventana y la figura caer.
Después de que un compañero hiciera unos cambios, apliqué el parche de Darcs, compilé y cuando fui a ejecutarlo, ¡Sorpresa! «Violación de segmento».
A mi compañero le funciona, aunque él utiliza Windows que gestiona la memoria de modo diferente. Él me recomendó ir quitando parches con Darcs (los cambios que se habían hecho) e ir probando a compilar y ejecutar para ver en cual estaba el problema. Después de hacer varias pruebas y obtener el mismo error, decidí dejarlo todo como estaba cuando funcionó y probar suerte, pero esta vez también daba error.
No he cambiado nada de la configuración del pc, ni he instalado nada nuevo.
¿Es problema de mi pc?
¿Alguien que tenga Debian Etch o Ubuntu (a falta de pan...) se ofrece a probarlo para ver si le da error o no?
Si quereis probarlo podeis descargar el repositorio desde aquí mismo. Hay que descomprimirlo, luego compilarlo y finalmente ejecutarlo.
Gracias por la ayuda.
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Notapor hugoruscitti » Jue May 08, 2008 7:16 pm

Saludos, el problema se produce en la linea 222 del archivo 'principal.cpp'.
Al parecer ustedes cargan las imágenes sin verificar si SDL las pudo cargar
correctamente; y en este caso SDL no pudo cargar la imagen, por ello no
retorna una superficie sino NULL y al querer hacer algo con ella el programa
falla:

Imagen

viendo un poco mas la estructura de archivos, observo que el código quiere
cargar una imagen terminada con '.png' cuando en realidad el archivo en
disco tiene la extensión '.PNG'. Esto no es un problema en Windows porque
no distingue entre mayúsculas y minúsculas pero GNU/Linux sí. Como solución
sería bueno que verifiquen el retorno de IMG_Load y si es NULL impriman un
error. Ah, y es muy importante respetar con exactitud los nombres de archivos.

por cierto, ¿hay gente programando con Windows por ahí?, que horror... nah, es broma :)


Te comento algo para la próxima vez que te ocurra algo similar: El motivo
de un Segmentation Fault se averigua rápidamente usando un depurador como
"gdb" o "DDD" que comenté en otro mensaje de este foro:

http://www.losersjuegos.com.ar/foro/vie ... ?p=568#568

el depurador (gdb) y su versión gráfica (ddd) se instalan ejecutando
el siguiente comando:

Código: Seleccionar todo
apt-get install ddd


o escribiendo 'sudo' delante de lo anterior si utilizan Ubuntu (como yo).

Sería bueno que también agregues este archivo Makefile que provee
lo necesario para compilar fácilmente el programa en GNU/Linux (y
además hace que el binario se pueda depurar):

Código: Seleccionar todo
# NOTAS:
#    -Wall emite cualquier mensaje de advertencia mientras se compila.
#    -gdb3 agrega una tabla de símbolos extensa al binario para depurar.
CC=g++
CFLAGS=-Wall -ggdb3 `sdl-config --cflags`
CXXFLAGS=$(CFLAGS)

LDFLAGS=`sdl-config --libs` -lSDL_image -lSDL_mixer
SOURCES= bloques.cpp principal.cpp figuras.cpp cuadricula.cpp timer.cpp
OBJS=$(SOURCES:.cpp=.o)

principal: $(OBJS)

clean:
   $(RM) principal *.o


por cierto, un fallo como Segmentation Fault es siempre un fallo del
programa, en algunos equipos tal vez no aparezca, pero eso no significa
el programa no tenga un defecto. Lo comento porque anteriormente preguntabas
si el problema es tu PC... y no, el problema está en el programa.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Dokan » Jue May 08, 2008 10:34 pm

Gracias por tu pronta respuesta.
He modificado las extensiones de las imágenes a minúsculas y ahora sí ha funcionado.
El enlace al tutorial de punteros es muy didáctico, me ha venido bien para comprender mejor los punteros.
DDD es para mi un programa completamente desconocido, tendré que estudiarlo con detenimiento porque llevo un rato intentando hacerlo funcionar y me da error al cargar un ejecutable:
DDD: No source
/proyectos/sysdeps/i386/elf/start.S: No existe el fichero o el directorio

El programa funciona, arranca, no da errores, pero al cargar el ejecutable me sale en una ventanita ese error. Por supuesto ese path no existe, ni sé por qué tendría que existir... tampoco he encontrado nada que me pueda ayudar.
En fin, que ya llevo un rato y es hora de acostarse, mañana probaré lo del makefile.
Gracias otra vez por tu ayuda.
EDITO
Vale, hay que compilar con «-ggdb3».
Mañana más.
Avatar de Usuario
Dokan
 
Mensajes: 143
Registrado: Lun Dic 03, 2007 10:40 pm

Notapor hugoruscitti » Vie May 09, 2008 4:08 pm

Dokan escribió:EDITO
Vale, hay que compilar con «-ggdb3».
Mañana más.


Exacto, para que DDD pueda funcionar necesita que al compilar
tu programa utilices la directiva "-ggdb3" o "-g" que es menos
específica. El motivo de esto es que gdb (el motor de DDD) necesita
obtener información mas detallada del archivo binario para poder
hacer un seguimiento.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor lacabra25 » Vie Ago 15, 2008 11:41 am

hugoruscitti escribió:por cierto, ¿hay gente programando con Windows por ahí?, que horror... nah, es broma :)


Pues aunque pudiera parecer imposible, si, jeje :), yo por ejemplo, aunque no porque quiera si soy sincero sino por que la memoria del PC se me queda un poco corta para instalar Ubuntu, y encima es por poco que fastidia mas, (si no recuerdo mal me faltaban 20 Mb o 25).
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron