Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Cómo Saber En Que Punto Ha Dejado De Funcionar

Iniciado por Helius, 15 de Julio de 2003, 11:33:17 PM

« anterior - próximo »

Helius

 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ó.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

samsaga2

 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.

ethernet

 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

Helius

 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?
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

nostromo

 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

MChiz

 Pero si haces un catch de la ellipsis ( ... ) no te funciona?

ethernet

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

Helius

 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
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

ethernet


Tei

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:






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.