Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: Helius en 15 de Julio de 2003, 11:33:17 PM

Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: Helius en 15 de Julio de 2003, 11:33:17 PM
 Alguién sabe si se puede saber en tiempo de ejecución (osea mostrar en un msgbox por ejemplo) en que línea un programa ha realizado una excepción inesperada?? es decir, aquellas q se lanzan solas sin llamar a throw, como el acceso a un puntero nulo.

Esto me sería muy útil porque estoy vendiendo un juego por internet y necesito que los usuarios cuando tengan un problema me puedan indicar en que punto exacto se produce la excepción, cuando es inesperada claro, porque cuando la lanzo con throw ya tengo implementado que diga en que número de línea la lanzó.
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: samsaga2 en 16 de Julio de 2003, 08:42:07 AM
 Creo que este http://www.hpl.hp.com/personal/Hans_Boehm/gc/ recolector de basura te puede servir. Aunque tampoco estoy muy seguro si sirve tambien para control de accesos a punteros nulos.

Pero bueno, estas cosas tendrias que intentar sacarlas tu a base de debugger.
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: ethernet en 16 de Julio de 2003, 02:14:54 PM
 Cuando a mi me pasa eso y la aplicacion esta compilada en debug con vc++ 6.0 me sale un mensaje en el q me pone "press cancel to debug aplication". Al persionar debug abre el debugger del vc++ y me va exactamente al punto donde peta. Ademas por si no tienes claro donde ha petado (quizas pete en una funcion q no es tuya pero si gracias a ti ;) puedes ver la pila de llamadas a funciones en un combox justo encima de donde se ven los valores de la variables.

saludos
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: Helius en 16 de Julio de 2003, 08:10:47 PM
 No, a ver... se trata de la versión Release. Yo no puedo depurarlo porque digamos que lo ha ejecutado un cliente en el otro lado del mundo. Lo que necesito es mostrarlo por pantalla o escribirlo en el log del juego.

Claro que se que se puede ver la pila de llamadas, lo util sería poder escribir ver esa pila de llamadas en el log o algo por el estilo. El caso es que si le peta a un cliente yo pueda saber en que punto. Con 'throw' esto se puede hacer ya que lanzas una excepción conocida y sabes en que línea, pero cuando son inexperadas, esas de los tres puntitos (. . . ), no se que hacer...

¿me explico?
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: nostromo en 17 de Julio de 2003, 12:14:35 AM
 Hola Helius, antes que nada felicitarte por la iniciativa de vender tu juego por internet.

Respecto ese problema que tienes:
La mejor manera es que lo pruebes mucho mediante gente que te eche una mano con el betatesting.

Una cosa que te puede servir es añadirle un comando o una combinación de teclas (como si fuera un "cheat") para que se active una funcion de log dentro de tu juego. Lo que principalmente guardaria serian las variables que definen el estado del juego, como si hicieras un savegame pero continuo.
Con esto último podrias pedirle a un cliente tuyo que activara ese log y que intentara reproducirlo y una vez llegado al "cuelgue" que te envie el log.... Segun como sea el cliente esto puede ser una pesadilla para él claro....

En fin,

Un saludo
Nostromo
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: MChiz en 17 de Julio de 2003, 12:24:55 AM
 Pero si haces un catch de la ellipsis ( ... ) no te funciona?
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: ethernet en 17 de Julio de 2003, 12:25:08 PM
En vc++6.0 si hago throw teniendo un catch(...) me da un error rarisimo, ya me paso hace tiempo pero no le di importancia.

Un buen truco para saber la pila de llamadas es la tecnica q usa el unreal:



#define guard(func)   {static const TCHAR __FUNC_NAME__[]=TEXT(#func); try{
#define unguard    }catch(TCHAR*Err){throw Err;}catch(...){appUnwindf(TEXT("%s"),__FUNC_NAME__); throw;}}


y despues en la funcion que queramos testear:



Juego::Frame()
{
guard(Juego::Frame)

//codigo

unguard;

}



Si esto lo haces para las demas funciones y metodos al final tendras la pila de llamadas.
Otra cosa importante de este sistema es q si no quieres tener una pila de llamadas o no quieres tener excepciones en tu programa simplemente tienes q cambiar las macros y listo :).

saludos
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: Helius en 17 de Julio de 2003, 06:36:17 PM
 Gracias ethernet, ese truco esta genial, me sirve de mucho pero el temazo sería saber en que línea a cascado porque tengo funciones realmente grandes y saber la ultima función que se ejecutó me ayuda mucho pero sigo sin saber en que punto ha reventado  :rolleyes:

nostromo gracias por tu felicitación, por cierto... claro que tengo un log, pero si no localizo el error cómo voy a escribirlo en el log?  :D
ethernet se ha aproximado mucho a lo que yo necesito mostrar precisamente en el log  ;)

ah!, si alguno quiere ver el juego está en http://www.planetiso.com/helium
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: ethernet en 17 de Julio de 2003, 07:57:30 PM
 dáselas a tim sweney q es el puto amo :)
Título: Cómo Saber En Que Punto Ha Dejado De Funcionar
Publicado por: Tei en 18 de Julio de 2003, 02:29:21 PM
yo haria un sistema de log. Hazlo permanente o activable. Cuando haya un error que el usuario te envie el log o que este se envie solo. No imagino nada mas util y practico.

fuerza el flush en el log tras cada escritura, para que la informacion util no se quede en memoria ( o cierra y abre cada vez )

ya se que habeis hablado ya de logs, pero me parece que ante problemas esta el log, luego el log y despues otra cosa. :ph34r: