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, à ça près que l'on peut également choisir la priorité du message que l'on souhaite envoyer !
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 :
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.
Tutoriel d'installation et d'utilisation :
https://gitea.planet-casio.com/Milang/liblog/src/branch/master/README.md
Voilà, je vous laisse essayer et debugger, 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
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/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);
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
Citer : Posté le 19/09/2019 21:41 | #
Oh, génial ça
Bon, manque plus que le debug/logging USB maintenant
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
Citer : Posté le 20/09/2019 07:54 | #
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.
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.
Citer : Posté le 20/09/2019 10:03 | #
dsize fournit la taille de la chaine en pixels, c'est bien ça ?
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.
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 ?
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.
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)
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.
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
Citer : Posté le 20/09/2019 15:43 | #
132.
Edit : Avec cette police.
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 ?
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.
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
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.
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
Citer : Posté le 21/09/2019 10:58 | #
Si tu veux je teste sur l'émulateur des graph Monochrome .
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)
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)
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'