Dan's Orbiter page

Orbiter Francophone => Création Orbiter Francophone => Topic started by: DanSteph on 25 June 2007, 19:48:18

Title: [tutorial] Comment debugger pas à pas sa DLL ?
Post by: DanSteph on 25 June 2007, 19:48:18

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352



1-Comment debugger pas à pas sa DLL ?

Debugger pas à pas est extrement utile voir carrement indispensable pour qui veut aller loin sans ce prendre la tête.
Quand Orbiter s'execute tout votre code est caché et vous n'en voyez que les effets, que faire maintenant si votre
vaisseaux ne fait visiblement pas ce que vous pensiez avoir programmé ? L'ordinateur est idiot, il ne fait que ce que vous lui avez dis de faire, il est facile de ce tromper même si on a relu le code cent fois. Pouvoir lire la valeur d'une variable en temps réel est donc pratiquement indispensable certaines fois.

Il y a deux methodes: L'affichage de variable sur l'ecran Orbiter et le debuggage proprement dis.


Affichage de variable sur l'ecran Orbiter


On peut afficher une variable en temps réel grace a la fonction DebugString() d'orbiter.

Cette méthode est surtout pratique quand vous devez surveiller l'évolution de certaines variables comme par exemple lors de l'écriture d'une pilote automatique. Pour démontrer son usage reprenez l'exemple du ShuttlePB du tutorial 1 (voir sommaire) nous allons dabord rajouter une fonction qu'Orbiter appellera à chaque image "clbkPostStep()", c'est en général dans cette fonction que ce font toutes les choses dynamique comme pilote automatique, animations, et des centaines d'autres chose. Elle manque dans le ShuttlePB car il est très basique, pas d'animations ni de pilote rien c'est pourquoi nous commencons par la rajouter.

Trouvez la ligne:
"void clbkSetClassCaps(FILEHANDLE cfg);"

TRUCS: CTL-F (recherche) et entrez "void clbkSetClass" pour arriver dessus.

Rajoutez à la ligne juste en dessous:
Code: [Select]
void clbkPostStep (double simtt, double simdt, double mjd);La nous avons déclaré cette fonction, nous allons maintenant la créer. Juste en dessous des lignes:
// =======================================
// overloaded callback functions
 // =======================================


Rajoutez les lignes:
Code: [Select]
void ShuttlePB::clbkPostStep (double simtt, double simdt, double mjd)
{
      double MonAltitude=GetAltitude();
      sprintf (oapiDebugString(), "Mon Altitude=%.2f Temp de mission: %i",MonAltitude,(int)simtt);
}
Compilez et lancez Orbiter, vous devez avoir un affichage comme ceci sur l'ecran:

(http://orbiter.dansteph.com/screenshot/dansteph/TutoSDKDebugString.jpg)

Explication: la fonction sprintf copie dans la chaine DebugString() d'orbiter les valeurs listée à droite avec
le format listé entre guillemet par le caractère "%" ainsi "%.2f" instruit d'afficher une variable flottante (float) ou double (genre 2.453) avec deux chiffre après le point, %.5f affiche 5 chiffres après le point et %0.f n'en affiche aucun.
%i lui affiche une variable entiere (int)

Pour une aide sur "sprintf" qui est une fonction C++ selectionnez le et appuyez sur F1 qui est l'aide contextuelle.


Le debuggage avec VC++ Express

Pour autant qu'un programme ou DLL contiennent des information de deboggage (compilé en mode "debug") on peut executer pas a pas et mettre des "points d'arret" sur les lignes de code de n'importe quel application: flight simulator, window XP ou ... Orbiter. La methode précédente ne marchera pas par exemple pour des fonctions appellée très tot dans Orbiter comme clbkSetClassCap() qui est appellée avant que l'affichage soit actif.

En bref : savoir debugger est un MUST qui vous sauvera probablement a maint reprises.

Orbiter ne contient pas d'information de deboggage (compilé en mode "release") mais votre DLL oui, nous allons donc le lancer en mode débug avec la methode ci-dessous:

ATTENTION: en mode débug toujours lancer l'application en mode fenetré, sinon en plein ecran une plantée ou un blocage vous obligera à redemarrer le PC.

Allez dans projet "Propriété de ShuttlePB" puis regler le deboggage comme ci-dessous en donnant à "commande" le chemin complet et l'application Orbiter.exe et dans "repertoire de travail" le repertoire.

(http://orbiter.dansteph.com/screenshot/dansteph/TutoSDKDebug1.jpg)

Ensuite nous allons mettre un "point d'arret" sur une ligne de code, Orbiter s'arretera quand il executera cette ligne et vous pourrez executer chaque ligne pas à pas et voir toutes les valeurs des variables.

Selectionnez une ligne de code et pressez "F9" un point rouge apparait en face de la ligne:

(http://orbiter.dansteph.com/screenshot/dansteph/TutoSDKDebug2.jpg)

Pressez "F5" ca lancera Orbiter (répondre "oui" à "continuer le deboggage"), n'oubliez pas de choisir dans le launchpad le mode fenetré, puis selectionnez un scenario et lancer Orbiter. Il va demarrez et s'arretera sur votre ligne de code (pour AUTANT que vous ayez un shuttlePB dans le scenario, si vous n'en avez pas utiliser le Scenario editor d'Orbiter pour en rajouter un)

Et hop, magique, Orbiter c'est lancé puis minimisé et s'est arreté sur la ligne avec le point rouge, en bas dans le cadre vert vous voyez toutes les valeurs des variables locale

(http://orbiter.dansteph.com/screenshot/dansteph/TutoSDKDebug3.jpg)

Ensuite avec F10 vous pouvez executer chaque ligne pas à pas, avec F11 même chose mais si il rencontre une fonction il essaiera d'executer pas pas les lignes dans cette fonction (F10 saute les fonctions) F5 relance l'execution normale et F9 active/desactive un point d'arret.

Exercice:

Reprennez le code précédent (Affichage de variable sur l'ecran Orbiter), lancez Orbiter, un scenario avec un SHuttlePB, décollez le shuttlePB puis basculer avec ALT-TAB sur VC express et mettez un point d'arret à la ligne:
"double MonAltitude=GetAltitude();"

La fleche jaune va venir sur cette ligne Orbiter sera arreté, appuyez sur F10 une fois pour executer cette ligne et voirr la variable "MonAltitude" qui a maintenant la valeur donné par la fonction "GetAltitude()", maintenant appuyez sur F5 et F10 rapidement et regarder evoluer cette valeurs au fur et à mesure que votre vaisseau décolle.

TRUC: mettez le point d'arret sur la ligne suivante comme cela vous n'avez que des F5 a faire pour voir evoluer l'altitude.



Message modifié ( 14-05-2008 02:47 )
Title: Re: [tutorial] Comment debugger pas à pas sa DLL ?
Post by: DanSteph on 25 June 2007, 22:03:54

Cliquez le lien ci-dessous pour retourner au sommaire des "tutorials pour créer une DLL Orbiter"
http://orbiter.dansteph.com/forum/index.php?topic=6335.msg95352#msg95352