2011-08-20 16 views
8

Aquí está mi situación: estoy trabajando en un juego basado en AS3 y me gustaría tener un "¡Informe un problema!" funcionar dentro del juego para que los usuarios puedan enviarme sus comentarios.¿Tiene ActionScript un equivalente a un "volcado del núcleo"?

Cuando mi usuario informa un problema, me gustaría obtener la mayor información posible sobre el estado de su juego; básicamente qué objetos están en la memoria, cuáles son los valores de todas esas variables dentro de todos esos objetos; esencialmente la misma información que puedo obtener cuando alcanzo un punto de interrupción en el depurador.

¿Hay una manera simple de hacer esto? Me temo que pasaré varios días intentando escribir un montón de funciones que me proporcionen toda esta información, solo para que alguien me diga después: "Ah, ¿por qué no llamaste a ASUtils.getSnapshot()"? ?

+0

Hay evidencia circunstancial de que Flash Player no mantiene suficiente información en tiempo de ejecución para realizar un volcado general significativo. En particular: el hecho de que 'Error.getStackTrace()' solo funciona en el reproductor de depuración. –

+0

Puede inyectar rastreos de llamada utilizando una secuencia de comandos que ejecuta antes de publicar. Esto le permite grabar el historial de llamadas de funciones en reproductores flash que no requieren depuración. (ver mi respuesta a continuación) – Toxikman

Respuesta

7

No hay manera genérica en AS3 para volcar el estado de sus variables, pero hay varias cosas que hacemos que le puede resultar útil:

  1. capturará un registro de la actividad de clics reciente. Utilice el detector de eventos de escenario para registrar los clics y rastrear el objeto "ruta" en la cadena primaria hasta el escenario. La ruta del objeto es solo todos los nombres de DisplayObject, como: screenMain.dialogBuyItem.buttonBuy
  2. Capture una captura de pantalla, reduzca a una miniatura pequeña, codifique JPEG y cárguela en su servidor junto con sus comentarios. También hacemos esto cuando hay una excepción (ver # 4). as3corelib tiene funciones de codificación JPEG en com/adobe/images
  3. Escriba un script de línea de comando o PHP que puede ejecutar en su código AS3 antes de publicarlo que inyectará el seguimiento de llamadas en la parte superior de cada llamada de función. Esto permite registrar el historial de llamadas. Si bien no es tan bueno como una pila completa, te dará una indicación de lo que tu código ha estado haciendo recientemente.
  4. Trap realiza excepciones y excepciones no controladas y las registra en su servidor con actividad de clic y rastreo de historial de llamadas. Los detectores de excepción no manejados son nuevos en flash 10.1, pero la mayoría de los usuarios tienen esta característica. Puede comprobar que el apoyo y añadir un oyente como esto:

    // Check for the presence of the Flash 10.1 global Error event (exception) handler class. 
    // If it exists, we'll listen for it and it will allow us to report errors to our server. 
    if (loaderInfo.hasOwnProperty('uncaughtErrorEvents')) 
        loaderInfo.uncaughtErrorEvents.addEventListener("uncaughtError", onUncaughtError); // UncaughtErrorEvent.UNCAUGHT_ERROR 
    
  5. Si tiene variables de estado globales que desea conectarse con un comentario, puede escribir una función para volcarlos a una cadena para subir con el comentarios del usuario Si bien puede enumerar las propiedades de clase y objeto utilizando for each, esto solo funciona para miembros públicos. Busque en Google y encontrará algunas funciones que las personas han escrito para volcar objetos y datos de matriz recursivamente utilizando este truco de enumeración.

+0

Muy completo. Acerca de las variables de dumping a una Cadena, esta es la que yo uso: [ObjectUtil.as] (https://github.com/magicalhobo/SWFWire/blob/master/SWFWireUtils/src/com/swfwire/utils/ObjectUtil.as).Se enfoca en lucir bonita en lugar de rendimiento. –

+0

El código de Sean para volcar objetos es bueno. SWFWire es impresionante, buen trabajo Sean! Intenté ejecutar nuestro juego a través del SWFWire Debugger, pero no funcionó. :(Publiqué un error en GitHub. Sería una gran herramienta para detectar objetos que no están recibiendo basura recolectada. – Toxikman

1

me gustaría añadirlo como un comentario, pero no quiero perder el formato de código
esto es lo que estoy usando para rastrear objetos complejos:

private function parseObject(o:Object, prefix:String = '>'):String { 
     var retStr:String = ''; 
     for (var s:String in o) { 
      retStr += prefix + s + ' = ' + o[s] + '\n'; 
      if (typeof(o[s]) == 'object') { 
       retStr += parseObject(o[s], prefix + '>'); 
      } 
     } 
     return retStr; 
    } 

Espero que sea útil

Cuestiones relacionadas