On a reçu pas mal de commentaires et de questions via le formulaire de contact sur le blog WP7Team, et en y répondant je me suis rendu compte que beaucoup de développeurs débutants se retrouvent coincés face à des problèmes simplement parce qu'ils ne savent pas débugger. Cet article est une adaptation d'un des mails que j'ai écrit pour répondre à l'une des questions reçues.
Coder sans débugger, c'est un peu comme avancer dans un labyrinthe les yeux bandés! Dès que vous vous retrouvez face à un mur, vous êtes incapable de dire comment vous êtes arrivés là.
Sans être un expert en la matière, je pense pouvoir vous donner quelques conseils très très basiques qui pourront peut-être vous éviter des crises de nerfs!
1/ Lancer l'appli en Debug.
Premièrement, passez en mode Debug. Pour lancer l'exécution de votre application en Debug, cliquez sur la flèche verte ou appuyez sur F5 (Start Debugging).
[caption id="attachment_241" align="aligncenter" width="265" caption="Configuration: Debug"]

[/caption]
2/ Placer des breakpoints.
[caption id="attachment_243" align="aligncenter" width="750" caption="Breakpoints: points d'arrêt"]

[/caption]
Dans la barre de gauche il y a des points rouges. Ce sont des points d’arrêts, et quand je lance mon appli en mode debug, comme c’est le cas ici, l’exécution s’arrêtera à chaque point d’arrêt !
Donc, lancez l’application, et vous verrez le premier point d'arrêt rencontré se surligner en jaune :
[caption id="attachment_563" align="aligncenter" width="1030" caption="La ligne surlignée en jaune est celle sur le point d'être exécutée!"]

[/caption]
Notez bien que la ligne surlignée n'a pas encore été exécutée!
Si vous vous arrêtez sur la ligne suivante, myObject ne sera pas encore initialisé et aura null pour valeur.
MyObject myObject = new MyObject();
3/ Naviguer en debug
Le bouton « play »
(F5) permet de relancer l’exécution jusqu’à ce qu’on rencontre un nouveau point d’arrêt. Vous pouvez stopper ou redémarrer l'application: 
Pas loin, vous trouverez des contrôles assez intéressants: 
Le premier, StepInto (F11), va passer à la ligne suivante où rentrer à l’intérieur d’une méthode si la ligne sur laquelle on se trouve fait appel à une méthode !
Celui du milieu, StepOver (F10), va passer à la ligne suivante, sans s'occuper des appels de méthodes.
Et le dernier, StepOut (Maj + F11), va relancer l’exécution jusqu’à ce qu’on remonte d'un niveau, c'est à dire jusqu'à ce que l'on sortant de la méthode dans laquelle on se trouve pour arriver au code ayant fait appel à cette méthode.
4/ Observer
Un des avantages des points d'arrêts est qu'ils vous permettent à un moment donné d'observer la valeur des variables que vous avez créées. Cela vous aidera peut-être à comprendre pourquoi votre programme ne se comporte pas comme vous l'espériez!
Il existe plus moyens pour observer vos variables, comme cette vue, que vous devriez apercevoir lorsque vous lancez votre application en debug:
Si cette vue n’est pas affichée chez vous, allez dans le menu Debug > Windows.
Affichez « Locals » et dans « Watch » affichez « Watch1 » (On parlera de celle-ci plus bas ;) ).
Une autre possibilité pour espionner vos variables consiste simplement à placer le curseur de votre souris par dessus un nom de variable.
Sur l'image ci-dessus, en passant par-dessus le« e », vous pouvez voir grâce au menu contextuel que cette variable représente un DownloadStringCompletedEventArgs. Même pas besoin de connaître le début du code! Si l'on avait placé le curseur par dessus le "Cancelled", vous pourriez voir apparaître [ e.Cancelled |false ] (ou true évidemment :) c'est selon! )
Regardons un exemple un peu plus complexe, tiré d'un code de MSDN:
Ici, l'objet this est un objet de type MainForm de l'espace de nom PluginRegistrationTool. Les valeurs affichées juste en dessous représentent les valeurs des propriétés
, et les champs private
de l'objet.
La première ligne, "base", permet d'accéder aux propriétés et champs hérités de la super-classe qui est ici System.Windows.Forms.Form. On peut décider d'aller voir ce qu'il s'y cache:
On peut voir que cette classe hérite elle-même de System.Windows.Forms.ContainerControl, qui possède une quantité de propriétés. Vous pouvez bien évidemment décortiquer chacune de ces propriétés exactement de la même manière :)
5/ Evaluer des expressions
Explorer à la souris, c'est pratique et rapide, mais parfois ce ne sera pas suffisant. C'est le cas dans l'exemple suivant:
J'aimerais beaucoup savoir ce que vaut Math.Pow(z, y) à ce moment du programme, parce que ça m'aiderait à comprendre pourquoi je n'ai pas de chance et ne satisfait jamais la condition! Mais je suis nul en math :/ Et en fait, j'aimerais aussi savoir combien vaut mon opération si vraiment ce n'est pas égal à 100! :)
C'est là qu'intervient la vue Watch que je vous ai fait ajouter tout à l'heure!
Pour l'utiliser, rien de très compliqué, il suffit de sélectionner une expression, et de la glisser sur la vue :) On sait maintenant que le résultat est...
Et puis rien ne nous empêche de mettre le premier membre de l'expression tout entier!
[caption id="attachment_579" align="aligncenter" width="472" caption="Effectivement, on est loin du compte..."]

[/caption]
Et ce qui est tout aussi pratique, c'est que vous pouvez finalement taper n'importe quelle expression directement dans la colonne Name de la vue Watch:
5/ Les exceptions
Pour terminer, parlons d'un des points essentiels: les exceptions! Je vais reprendre le problème rencontré par le développeur qui nous avons contacté et qui a fait que j'écris ce post aujourd'hui.
Cette personne développait une application pour Windows Phone et utilisait un HyperlinkButton, avec pour valeur de la proprité NavigateUri un lien vers une page web. Dans son dernier mail, cette personne me disait:
[...] je suis incapable de comprendre pourquoi lorsque je clique sur le titre du post, sur lequel j'ai fait pointer l'url de la vidéo désormais, fait planter l'application, au lieu d'ouvrir IE [...]
Là, j'ai compris que je ne pouvais pas le laisser continuer à développer sans lui apprendre à lire et comprendre les exceptions.
Je ne vais pas faire ici un cours complet sur ce qu'est une exception. Le but n'est pas que vous sachiez comment créer les vôtres, mais bien de comprendre ce qu'elles veulent dire. Sachez déjà que lorsqu'une exception est lancée dans votre application, cela signifie que quelque chose ne s'est pas passé comme prévu, et cela empêche votre programme de continuer à s'exécuter! En général, chez un débutant, cela signifie tout simplement le plantage et la fermeture de l'application illico!
Si toutefois vous ne savez pas comment gérer ses exceptions, je vous invite grandement à lire ceci: try-catch (C#).
Revenons au problème:
J'ai mon HyperlinkButton, et sa propriété NavigateUri pointe vers une url tout à fait correcte. Lorsque je lance l'application en debug, et que je clique sur le lien, il y a effectivement une erreur, et je me retrouve dans cette partie du code :
Ici, l’exception est traitée par le code généré par visual studio quand vous créez un projet (c'est un peu un cas particulier) mais en général quand il y a une exception, l’application s’arrête et un pop-up apparaît dans visual studio en pointant sur la ligne de code qui a déclenché l’exception !
[caption id="attachment_584" align="aligncenter" width="731" caption="NullReferenceException signifie que vous essayez d'appeler une méthode sur une référence null. Généralement, le type de l'exception est assez explicite pour comprendre quel est le problème."]

[/caption]
Dans le cas du problème de navigation, ce n'est à première vue pas aussi simple. Mais les techniques apprises plus haut vont vous permettre de vous en sortir sans difficulté!
Si vous exploriez le paramètre « e », vous verriez dans e.Exception.Message la valeur : {"Navigation is only supported to relative URIs that are fragments, or begin with '/', or which contain ';component/'.rnParameter name: uri"}.
On comprends donc bien que l’HyperlinkButton ne permet tout simplement pas de naviguer vers une page web mais uniquement vers des pages de l'application même.
Matthieu Vandenhende apporte une petite correction dans les commentaires! N'hésitez pas à visiter son blog. C'est plein de bons conseils sur le développement Windows Phone!
Il est tout à fait possible de naviguer vers une page web depuis un HyperLinkButton. La solution est de préciser comment va s’ouvrir la page avec l'attribut TargetName. Ex:
<HyperlinkButton Content="Devillu BLOG"
NavigateUri="http://blog.devillu.com" TargetName="_blank" />
Voilà, donc, comment Visual Studio peut vous permettre de mieux comprendre les problèmes rencontrés, et vous aider à vous corriger :)
La solution, en bonus! (pour ceux que ça intéresse :) )
Pour naviguer vers une page web sur Windows Phone 7, il faut utiliser l'un des nombreux launchers disponibles dans le SDK. Il s'agit du WebBrowserTask.
WebBrowserTask webBrowserTask = new WebBrowserTask();
webBrowserTask.Uri = new Uri("http://msdn.microsoft.com", UriKind.Absolute);
webBrowserTask.Show();