Un "problema" que no puedo encontrar!

Started by Noivern, October 02, 2010, 02:07:43 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Noivern

¡Buenas!

Miren tengo una duda. FreeYourMind amablemente me esta ayudando a hacer unas pruebas con el juego, y me reporta un crash que ocurre en la pantalla de game over. Hasta me sugerido un fix. ¡Mi problema es que yo no tengo el problema!. No logro reproducir el error, y he probado el juego en distintas máquinas, y JAMÁS me ha crasheado en la pantalla de game over.

El código es el siguiente:
Esto esta en un loop infinito en un proceso que solo controla la creacion y eliminacion de naves del jugador.
[code language="bennu"]
IF (dam=<0 AND dam2=<0 && creditos==0 AND !naveid && !nave2id)
             game_over();             
         end
                               
         IF (opcionContinue == 0 || key(_ESC)
               || ( joy_getbutton(0, controlesJoy[0].inicio) && joy_getbutton(0, controlesJoy[0].disparoNormal) && joy_getbutton(0, controlesJoy[0].disparoSecundario))
            || ( joy_numjoysticks() >= 2 && joy_getbutton(1, controlesJoy[1].inicio) && joy_getbutton(1, controlesJoy[1].disparoNormal) && joy_getbutton(1, controlesJoy[1].disparoSecundario)) )
            fade_off();
            frame(400);
            delete_text(ALL_TEXT);
            let_me_alone();
            stop_scroll(0);
            menu();
            signal(id,S_KILL);
                       
         END
[/code]

gameover() no es un proceso, es una function, justamente para evitar que siga la ejecucion del proceso padre, su código es:
[code language="bennu"]
function byte game_over()
private    
   int tiempo = 500;//5 segundos de contador (500 centesimas de segundo)
   int tiempoInicio;
   int txtid;
   //short cuentaFrames = 0;
   short tiempoAnterior;   
begin
   txtid = write(1,320,240,align_center,"GAME OVER");               
   tiempoInicio = timer[0] + tiempo;
   while (tiempo > 0)            
      tiempo = cuentaRegresiva(tiempoInicio);
            
      if (tiempoAnterior != tiempo/100)
         fade(tiempo*7,0,0,1);
      end
      
      tiempoAnterior = tiempo/100;
      frame;
   end
   delete_text(txtid);
   
   fade_off();
   frame(400);
   stop_song();
    delete_text(ALL_TEXT);
    let_me_alone();
    stop_scroll(0);
    menu();
   return true;        
END
[/code]

Repito nuevamente, NO HE LOGRADO REPRODUCIR EL CRASH que el me señala, y estoy como Condorito: plop!

SplinterGU

compilar con -g y correr con -d a ver donde cae.

ahi no veo nada raro.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Noivern

Ese es el problema, a mi no me crashea nunca en el gameover, por lo que no he podido reproducir el supuesto error, solo Free me ha reportado esto.

FreeYourMind

Como te he respondido por pm antes de ver esto, a mi me ocurre siempre, el problema que provoca el crash es el let_me_alone al intentar matar varios procesos al  pasar a game_over que se encuentran dentro del loop, me imagino que sera por la orden de ejecución de procesos (como ya sabemos incluso el comportamiento del rand difiere de procesador a procesador si no usamos semilla).

La solución la veo sencilla, esa condicion de paso a game over, haria solamente el break; y despues del loop pones el let_me_alone y todo lo que haces para volver a la pantalla menu().

Que eso sea una funcion no es el problema, yo lo pase a procedimiento y petaba igual, es el let_me_alone dentro del loop la causa (ni que lo pongas al principio del proceso menu se arregla, porque el procedimiento menu sigue dentro del loop), si lo comento no falla.

SplinterGU

vamos por partes.

1) let_me_alone no puede provocar un crash... ambos tienen las mismas versiones de bennugd? y la misma version del core y de los modulos? tienen la ultima?

2) el rand no cambia el comportamiento segun la maquina, podria segun la plataforma o arquitectura de procesador, pero el rand no puede ocacionar un crash

no free, tu sugerencia no tiene logica, lo que falla es otra cosa, hay que averiguar que.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

1 - No digo que el proceso let_me_alone en si lo haga, pero esta matando algun proceso que este al morir provoca el crash...
Si quito el let_me_alone, no hace crash y entra al menu, pero claro siguen existiendo enemigos paseandose por pantalla entre otras cosas.
Es ahí donde tiene que mirar, ver que procedimiento puede provocar el crash al morrir....

Si tengo la ultima compilada, y en mis juegos no me ha dado problemas (r165).

2 - El rand fue a modo de ejemplo,  no tiene que ver con el problema del juego.
No es el rand que cambia el comportamiento, pero si el procesador hace que el rand no se comporte de igual forma en distintos so si no defines la semilla (parece que ya no te acuerdas que comente esto hace tiempo, cuando al ejecutar el Skull en la Wiz, el rand devolvia siempre el primer valor en la primera llamada, cosa que se resolvio definiendo la semilla al principio del programa....)

Drumpi

Free, trata de poner un par de SAYs delante y detrás del let_me_alone para asegurarte de que es eso, porque si no, habría que hacer tracking para ver si ciertamente hay un proceso que llama a otro que no existe (esto debería saberse por cierto mensaje de error).
Se puede encontrar rápido examinando el código de los procesos que dependen de otros, y añadiendo lineas SAY para localizar la función conflictiva.

Si no da mensajes, el fallo es de los difíciles de localizar, de los que tienes que revisar el último código que has escrito. A mi me daba crash cuando usaba STOP_SCROLL sobre un scroll ya detenido.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Noivern

Buenas!
El único proceso propenso a dar crashes del que estoy conciente, por la manera de "vivir" y "morir" de este es el proceso sombra que se genera cuando pasa la nube gigante debajo de enemigos, nubes pequeñas y naves.
Pero en el gameover no tengo ni idea que puede ser si no se da la condición de estar esa nubezota en pantalla. Insiiiiiiiisto que no he logrado reproducir el crash en el gameover en distintas máquinas, tanto amd como intel.

FreeYourMind

Lo que necesitas es que mas gente pruebe el game over, para ver si ocurre a mas gente.
El say ya lo he probado, eso esta en un loop, con lo cual tienes say's a saco.
Lo del let_me_alone lo tengo mas que probado, es algun proceso que se esta matando que al morrir original el pete, posiblemente por variables que se pierden o variables a las que se acceden y dejan de existir.
A las cuales se esta accediendo constantemente ya que estamos dentro de un loop.

Noivern

#9
Creo haberlo solucionado!
Esperó que mañana o en la noche Free me responda.
Free me envió la carpeta en la que realizaba las pruebas y al testear utilizando exclusivamente lo que estaba en esta carpeta he comprobado que peta justo donde él dice, en gameover o al volver al menu.

En un principio pensé que era por que Free compilaba usando mochila ( -a ), pero acabo de comprobar que esto no es así.

El real problema eran las librerías, en específico el mod_sound. Free esta usando una del 11/08/2010 que pesa 33 Kb, y yo subo el juego con una del 28/08/2010 de 34 Kb. La diferencia creo que es la nueva función unload_song(* int) que la utilizo para descargar de memoria las canciones que no se esten utilizando, en el OnExit del proceso que controla la música que lógicamente se activa al llamar al let_me_alone(). Luego de reemplazar la librería (bueno, las reemplacé todas) automágicamente dejó de petar y funcionaba tal como en mis pruebas :D

FreeYourMind

#10
Nos merecemos una explicación Splinter!!!
O acaso aparte de las ya inumeras versiones, tambien te pones a remplazar los binarios de una versión con nuevas subversiones  ;D

FreeYourMind

Vale, el pujón me lo llevo yo  ;D
Algo he hecho que en realidad no tenia la version actualizada en esa carpeta, las releases estaban bien, y la opcion -a funciona sin problemas.
El juego ya chuta  ;)

SplinterGU

Quote from: Noivern on October 02, 2010, 07:19:35 PM
Creo haberlo solucionado!
Esperó que mañana o en la noche Free me responda.
Free me envió la carpeta en la que realizaba las pruebas y al testear utilizando exclusivamente lo que estaba en esta carpeta he comprobado que peta justo donde él dice, en gameover o al volver al menu.

En un principio pensé que era por que Free compilaba usando mochila ( -a ), pero acabo de comprobar que esto no es así.

El real problema eran las librerías, en específico el mod_sound. Free esta usando una del 11/08/2010 que pesa 33 Kb, y yo subo el juego con una del 28/08/2010 de 34 Kb. La diferencia creo que es la nueva función unload_song(* int) que la utilizo para descargar de memoria las canciones que no se esten utilizando, en el OnExit del proceso que controla la música que lógicamente se activa al llamar al let_me_alone(). Luego de reemplazar la librería (bueno, las reemplacé todas) automágicamente dejó de petar y funcionaba tal como en mis pruebas :D

claro, estas usando las nuevas funciones que resetean las variables.
ya lo dije yo, estan usando versiones diferentes de bennugd, y por otro lado, supongo que le estas pasando el dcb, cierto?

Quote from: FreeYourMind on October 02, 2010, 08:22:27 PM
Nos merecemos una explicación Splinter!!!
O acaso aparte de las ya inumeras versiones, tambien te pones a remplazar los binarios de una versión con nuevas subversiones  ;D
Quote from: FreeYourMind on October 02, 2010, 08:35:53 PM
Vale, el pujón me lo llevo yo  ;D
Algo he hecho que en realidad no tenia la version actualizada en esa carpeta, las releases estaban bien, y la opcion -a funciona sin problemas.
El juego ya chuta  ;)

las explicaciones ya fueron dadas cuando se comentaron las nuevas funciones.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Noivern

Quote from: SplinterGU on October 02, 2010, 11:46:58 PM

claro, estas usando las nuevas funciones que resetean las variables.
ya lo dije yo, estan usando versiones diferentes de bennugd, y por otro lado, supongo que le estas pasando el dcb, cierto?


No solo el dcb, también el .prg porque quiero testear algo que no puedo solo :D
Es importante agregar las nuevas funciones en la api (la wiki), yo me enteré de ella en el hilo de las novedades y me decidí a utilizarla inmediatamente.

Gracias por la pronta ayuda, igual siempre lo supe (?) D:! haha