Apache Adobe Flex TutorialTutoriaux Adobe Flex & AIR en Français

14mar/102

Flex Debug – Obtenir la StackTrace (pile d'appels) n'importe où dans votre code

Lorsque vous rentrez en debug avec Flex Builder et que vous mettez un point d'arrêt, vous pouvez visualiser la "stack trace", c'est-à-dire la pile d'appels.
Pour faire simple, on vous indique quelle méthodes ont été appelées pour en arriver à votre point d'arrêt:

stack-1

C'est extrêmement pratique pour débugger puisque vous pouvez naviguer dans cette pile et voir par exemple, la valeur d'une variable dans la méthode appelante. Cette vision n'est disponible qu'en mode debug et je ne pensais pas que l'on puisse faire un trace() de la pile d'appel courante sans être en debug dans Flex Builder.

Attention, à ne faire que pour du debug, pas en environnement de production (voir commentaire). Sinon, utilisez "if (Capabilities.isDebugger)" pour n'afficher cette stack trace que dans certaines conditions

Et pourtant, ce blog vient de montrer une "petite feinte" permettant d'obtenir la stack trace dans votre log.

Debug Actionscript Better with getStackTrace + Trace trick

Ils profitent du faire que lorsque l'on a un objet de type Error en ActionScript, on peut obtenir la stack trace qui a amené cette erreur par myError.getStackTrace().

Il suffit alors de créer un objet Error bidon (sans la lancer) et de faire un trace() de sa stack trace:

var er:Error =new Error("BREAK"); //creating but not throwing the error
trace(er.getStackTrace()); // see where the issue is happening, but continue running normally!

Voici ce que cela donne pour l'exemple que j'ai fait un peu plus haut:

Error: BREAK
 at com.bg.manager.queue::QueueLoadingManager/startLoading()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\com\bg\manager\queue\QueueLoadingManager.as:40]
 at BGISweb/init()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\script\BGISweb.as:62]
 at BGISweb/___BGISweb_Application1_applicationComplete()[F:\Workspaces\Flex\Flex_4.3\BGISWebFlexV3\src\BGISweb.mxml:4]
 at flash.events::EventDispatcher/dispatchEventFunction()
 at flash.events::EventDispatcher/dispatchEvent()
 at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\core\UIComponent.as:9298]
 at mx.managers::SystemManager/preloader_preloaderDoneHandler()[C:\autobuild\3.2.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2985]
 at flash.events::EventDispatcher/dispatchEventFunction()

Voilà, cela peut être pratique pour du debug à distance ou pour perfectionner un debug conditionnel. Notez que dans la stack trace, vous obtenez bien les numéros de ligne pour identifier plus facilement l'origine des appels.