Seuls les membres ayant 30 points peuvent parler sur le chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » liblog, une lib pour débugger efficacement
MilangHors ligneMembrePoints: 393 Défis: 2 Message

liblog, une lib pour débugger efficacement

Posté le 18/09/2019 17:33

Je vous présente une lib de log simple d'utilisation basée sur gint. Si vous n'avez pas gint, allez voir de ce côté ci : gint, un noyau pour développer des add-ins
L'utilisation se rapproche fortement de printf, on envoie juste une chaine de caractères et c'est tout !

On peut si besoin afficher ce log en cas d'erreur, ou simplement pour consulter l'état d'éxécution du programme à un moment donné. Le reste du temps, ce log est invisible, mais néanmoins stocké. La lib fournit notamment la possibilité d'afficher le log en cas d'exception (system error), avec la possibilité de faire défiler le continu avec les flèches.

En plus, la librairie est construite pour être multiplateforme, donc elle fonctionne aussi bien sur les fx9860g que les fxcg50. . En voici un exemple sur la famille des fx9860g :

Installation
clone
Tout d'abord, clonez le dépot gitea.
git clone https://gitea.planet-casio.com/Milang/liblog.git

configure
Au choix selon la famille de calculatrices ciblée:
./configure --fx9860g
./configure --fxcg50

make && make install
Taper ensuite quelque soit le modèle :
make
make install


La compatibilité avec fxcg50 reste toutefois à tester, mais je n'ai pas le matériel pour Il faut noter également que la librairie peut être installée simultanément pour les deux plateformes, il suffit juste de l'installer 2 fois, une fois par plateforme.

Utilisation
Configuration
Dans le fichier project.cfg du projet, modifier la ligne suivante
LDFLAGS =

Il suffit d'ajouter 2 nouveaux flags, comme ça
LDFLAGS = -llog-<fx/cg> -lgint-<fx/cg>
exemple pour les fx9860g : LDFLAGS = -llog-fx -lgint-fx
Voyons le code source, mainenant
D'abord, il faut inclure le header de liblog
#include <liblog.h>


Fonctions
Écrire dans le log est très simple :
On utilise la fonction ll_send("Votre message de debug\n")
Le \n sert à revenir à la ligne, mais vous pouvez afficher plusieurs messages à la suite, comme dans cet exemple :
ll_send("Bonjour,");
ll_send(" ceci est un log.\n");
ll_send("Pratique, non ?");

Ce code donnerait le log suivant :
Bonjour, ceci est un log.
Pratique, non ?

Cependant, le log est invisible et il faut l'afficher manuellement.
Afficher le log peut être utile pour le débug, notamment en cas d'exception.
Il suffira de taper la commande suivante :
ll_display();
// getkey(); si vous voulez mettre le programme en pause pour lire

Et maintenant nous arrivons probablement à la partie la plus intéressante, la fonction de gestion des exceptions ! Elle s'active avec cette fonction, ll_set_panic() En cas d'exception (System Error), elle vous affichera le log, et surtout vous laissera la possibilité de scroll et de remonter l'historique afin de voir qu'est ce qui a planté.

Enfin, la fonction ll_pause() fait la même chose que lors d'une panic, mais laisse la possibilité de continuer l'exécution du programme avec "EXIT"



Voilà, je vous laisse essayer, et vous pouvez poser vos questions sur ce topic si vous n'avez pas bien compris quelque chose . La lib est sous la GNU General Public License 3



Pages : 1, 2Suivante
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 18/09/2019 21:02 | #


Ooh, ça a l'air intéressant ça.

Petite note, sur la branche dev du fxSDK se trouve une autre version du système de compil' dans laquelle il y a notamment une variable LIBS dédiée pour les bibliothèques, et -lgint-<fx,cg> est ajouté automatiquement à la fin donc il suffira d'écrire LIBS = -llog. C'est pas encore sur la branche master mais je te le dis en avance !

À voir le code je suppose qu'il n'y a pas encore de quoi scroller ?

Tu peux essayer de t'en servir comme gestionnaire d'exceptions depuis peu, si ça t'intéresse :

#include <gint/exc.h>
#include <gint/keyboard.h>
#include <gint/defs/attributes.h>
#include <liblog.h>

GNORETURN void system_error(uint32_t code)
{
  ll_display();
  while(1) getkey();
}

/* In a function */
gint_panic_set(system_error);
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 18/09/2019 21:08 | # | Fichier joint


Pour l'instant les lignes de log non visibles ne sont pas stockées en mémoire, mais je le ferai peut être avec une liste chainée dans le futur. Actuellement, ll_display affiche l'équivalent d'un tty, sans scroll donc.

Quant à l'utilisation avec le gestionnaire d'exception, je comptais justement le faire

Et pour la variable LIBS, c'est une très bonne idée, je vais la tester sur la branche dev en attendant sa sortie officielle alors
Dark stormEn ligneMembre d'honneurPoints: 10869 Défis: 176 Message

Citer : Posté le 19/09/2019 21:41 | #


Oh, génial ça

Bon, manque plus que le debug/logging USB maintenant
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 07:51 | #


Bon, j'ai testé le message de panic, merci beaucoup, cela marche très bien, je ne vais pas tarder à l'ajouter dans master

Par contre j'aurais besoin d'informations supplémentaires sur l'écran de la graph 90 E, notamment au niveau de la largeur et de las hauteur en caractères histoire de faire le portage propre de cette lib
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 07:54 | #


Milang a écrit :
Bon, j'ai testé le message de panic, merci beaucoup, cela marche très bien, je ne vais pas tarder à l'ajouter dans master

Content de l'entendre ! Comme tu es hors d'une interruption tu peux utiliser toutes les fonctions que tu veux sans limites.

Par contre j'aurais besoin d'informations supplémentaires sur l'écran de la graph 90 E, notamment au niveau de la largeur et de las hauteur en caractères histoire de faire le portage propre de cette lib

La taille canonique est 8x9, mais la police est à taille variable, ce qui est très important : https://gitea.planet-casio.com/Lephenixnoir/gint/src/branch/compat/src/font8x9.png


Je te conseille de la laisser en taille variable et d'utiliser dsize() pour connaître la taille d'une chaîne. À moins que tu produises des choses en 2D dans tes logs, c'est mieux parce que c'est plus joli d'une part et plus serré d'une autre. Aussi, les caractères 0-9 et A-F ont tous la même largeur (7 pixels) pour pouvoir écrire de l'hexa sans la contrainte taille variable.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 10:03 | #


dsize fournit la taille de la chaine en pixels, c'est bien ça ?
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 10:05 | #


Yup. La hauteur des lignes tu peux la choisir constante (je conseille entre 12 et 14 pixels), et dsize() te donnera la largeur.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 10:22 | #


Le nom de la police par défaut est bien default sur les 2 modèles, n'est-ce pas ?
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 10:49 | #


Nope normalement il n'y a pas de nom public. Si tu veux l'utiliser, tu peux appeler dfont(NULL), et si tu veux son adresse tu peux récupérer la valeur de dfont(NULL) au début du programme.

Edit : si tu y tiens elles s'appellent gint_font5x7 et gint_font8x9.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 11:15 | #


En fait je comptais déterminer dynamiquement la taille de l'écran en fonction de la taille de la police, mais c'est une très mauvaise idée.
A la place, je vais faire en sorte que l'on puisse compiler 2 versions de la librairie, c'est plus flexible
Pour le faire il faut que je fasse un dossier de build et une lib avec des noms qui différent selon la cible, c'est bien ça ?
(build-fx | build-cg, et liblog-fx | liblog-cg)
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 12:07 | #


Oh, si tu parles des retours à la ligne, je pense qu'il faut les faire dynamiquement (ie. selon le contenu), et pas compter un nombre de caractères fixe.

C'est une possibilité oui.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 13:34 | #


Bon, j'ai ajouté le support sur les graph 90+E, il ne demande qu'à être testé
(Je n'ai pas de g90+e pour tester)

En plus, j'ai restructuré le code pour permettre le scrolling dans le futur

Euh, afin d'optimiser le poids du log en RAM (alloué dynamiquement), est ce quelqu'un peut me dire le nombre maximal de caractères que l'on peut loger sur une ligne ?

Ajouté le 20/09/2019 à 13:44 :
Bon, sitôt dit, sitôt fait, le scrolling est ajouté

Il marche sur les graph 35+E, à voir sur la gamme des fxcg50
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 15:43 | #


Euh, afin d'optimiser le poids du log en RAM (alloué dynamiquement), est ce quelqu'un peut me dire le nombre maximal de caractères que l'on peut loger sur une ligne ?

132.

Edit : Avec cette police.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 18:13 | #


Merci

D'ailleurs, j'ai l'impression que le gestionnaire d'exceptions ne fonctionne pas sur le casio fx9860g sdk. Est-ce normal ?
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 20:42 | #


Je ne l'ai pas testé du tout, de façon générale les émulateurs m'échappent. Je sais que sur l'émulateur Graph 35+E II il fonctionne [#168970], mais je n'ai pas été plus loin. Si tu en as besoin pour développer, je peux prendre le temps de regarder.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 20:46 | #


En fait, lorsque normalement il y a une exception, le programme s'arrête, et le sdk affiche un message sur l'erreur à l'adresse FF000024. Après ce n'est pas une priorité, j'étais simplement surpris de ne pas voir s'afficher le log, c'est tout
LephenixnoirEn ligneAdministrateurPoints: 16465 Défis: 140 Message

Citer : Posté le 20/09/2019 20:47 | #


Le SDK fait ça quand le processeur crashe... right? S'il le fait pour toutes les exceptions alors il n'y a aucun moyen de le contourner, et mon gestionnaire mémoire qui rattrape parfois des adress error ne marchera plus.
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 20/09/2019 20:58 | #


Bon, bah tant pis alors, ce n'est pas une grande perte

Ajouté le 21/09/2019 à 10:56 :
J'ai mis à jour le topic sur les fonctions disponibles et les instructions d'installation

Merci de tester lib est fonctionnelle pour les g90+E
De mon côté je vais essayer de tester sur émulateur, mais il faut que j'installe les outils supplémentaires, et une vm donc je ne le ferai pas tout de suite
KirafiHors ligneMembrePoints: 2119 Défis: 10 Message

Citer : Posté le 21/09/2019 10:58 | #


Si tu veux je teste sur l'émulateur des graph Monochrome .
iPod
Pour des parties rapides
Jusqu'où pourras-tu aller dans ce jeu "partie rapide" qu'est Dextris (élu Jeu Du Mois)
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
Autres
Franchement ils valent le coups
Deviens l'amiral de la marine dans SeaRush (jeu concours) (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
MilangHors ligneMembrePoints: 393 Défis: 2 Message

Citer : Posté le 21/09/2019 11:01 | #


Tu peux essayer
Elle marche avec le scrolling sur ma g35+E.
Elle marche sur l'émulateur du sdk, à l'exception du panic mais cela est du au sdk qui a un comportement différent en cas de crash

Ajouté le 21/09/2019 à 12:51 :
Bon, j'ai ajouté la fonction ll_pause() qui permet de suspendre l’exécution du programme, avoir la possibilité d'inspecter le log et reprendre l’exécution ensuite

De plus, à la suite d'une suggestion de @Kirafi, Il est possible d'envoyer plusieurs messages sur une seule ligne, et pour finir une ligne, on ajoute '\n'

Pages : 1, 2Suivante

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2019 | Il y a 130 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd