StackTrace en Flash/ActionScript 3.0
actionscript-3 stack-trace (8)
@hasseg tiene razón. También puede conservar la información de la pila en la versión de lanzamiento (no depurar) proporcionando -compiler.verbose-stacktraces = true al compilar su SWF.
Quiero ver el seguimiento de la pila en cualquier función de mi código, así que hice algo como esto para llamarlo e imprimir el seguimiento de la pila:
public function PrintStackTrace() {
try {
throw new Error(''StackTrace'');
} catch (e:Error) {
trace(e.getStackTrace());
}
}
Me gustaría saber si hay otra manera de hacer esto. En algún lugar, la clase Error crea el seguimiento de la pila, pero tal vez no lo hizo con ActionScript 3.0, por lo que tal vez no sea posible, pero quiero saber.
¡Gracias!
A partir de Flash 11.5, los rastros de pila funcionan en la versión de lanzamiento de Flash.
Sin embargo, eso no significa que esto ya no sea un problema. Si su aplicación está configurada para usar un compilador anterior a 11.5 en Flash Builder --> Project properties --> ActionScript Compiler
, no tendrá rastros de pila.
Además, en esa misma página puede ver su versión de AIR SDK. Si usa v3.4 o una versión anterior, no verá rastros de pila. Si este es su problema, todos sus desarrolladores deben actualizar su SDK de AIR siguiendo las instrucciones here .
Desde Flash Player 11.5, los rastreos de pila también están disponibles en las versiones sin depuración de los jugadores.
El método getStackTrace
devuelve el seguimiento de la pila solo en el depurador flash player ( https://www.adobe.com/support/flashplayer/debug_downloads.html ), en el lanzamiento el jugador devuelve null
. Asegúrese de tener el reproductor de depuración instalado y en ejecución.
-compiler.verbose-stacktraces=true
solo agrega el número de línea al seguimiento de la pila de depuración.
Prueba de muestra: https://gist.github.com/pipeno/03310d3d3cae61460ac6c590c4f355ed
He creado esta pequeña función:
public static function getStackTrace() : String
{
var aStackTrace : Array = new Error().getStackTrace().split("/n");
aStackTrace.shift();
aStackTrace.shift();
return "Stack trace: /n" + aStackTrace.join("/n");
}
Tengo esta función en una clase personalizada de "depuración" que uso con mis aplicaciones cuando desarrollo. Las dos llamadas a shift () eliminan las dos primeras líneas: la primera es solo la cadena "Error" y la segunda línea se refiere a esta función, por lo que no es útil. Incluso puede eliminar la tercera línea si lo desea (se refiere a la línea donde realiza la llamada a la función getStackTrace ()) agregando otra llamada shift (), pero la dejé para servir como punto de partida de la "pila" rastro".
Por lo que yo sé, la única manera de hacer que el seguimiento de la pila esté disponible para tu propio código es a través del método getStackTrace() en la clase Error, tal como lo estás haciendo. Sin embargo, en respuesta al ejemplo de su pregunta, mencionaría que en realidad no tiene que lanzar el error; puede simplemente crearlo y llamar al método en él:
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();
Además, como dice la documentación, esto solo funciona en la versión de depuración de Flash Player, por lo que puede ajustar esta funcionalidad en un bloque if que verifique el valor de Capabilities.isDebugger si lo desea.
Use el Flex DeBugger (FDB) que viene con el SDK de Flex. Es un depurador de línea de comandos que le permite depurar .swf, incluso los que están en línea (si es una versión de depuración). Le permite establecer puntos de interrupción, imprimir / cambiar variables y volcar la pila, y no requiere que agregue ningún código adicional . ¡Una herramienta muy útil que no deberías prescindir!
Las opciones de fdb que necesitará son ''break'' y especificar la clase y la línea donde desea que se detenga la ejecución, y ''bt'' o ''info stack'' para darle una traza inversa de la pila. También puede visualizar casi todo sobre la aplicación mientras se ejecuta.
var tempError:Error = new Error();
var stackTrace:String = tempError.getStackTrace();
escriba esta cadena stackTrace
en cualquier archivo para que pueda ver los registros de su programa también en modo ejecución. Por lo tanto, no necesita ejecutarlo solo en modo depurador. Escríbalo en el evento de aplicación de uncaughtexception
de uncaughtexception
, por lo que se ejecutará finalmente.