Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » liblog, une lib pour débugger efficacement
Milang Hors ligne Membre Points: 488 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, à ç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


Milang Hors ligne Membre Points: 488 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'

Ninestars Hors ligne Membre Points: 2456 Défis: 24 Message

Citer : Posté le 23/09/2019 18:39 | #


C'est formidable ta lib !
Pour le debug c'est vraiment top !!
Si on utilise des timers, est ce que cela met en pause les timers aussi quand on fait ll_pause() ?
Milang Hors ligne Membre Points: 488 Défis: 2 Message

Citer : Posté le 23/09/2019 19:08 | #


Ah, non, pas encore
Mais pour cela il faudrait également qu'elle restaure l'état des timers à la fin, ce qui doit être possible mais plus compliqué. En tous cas, je le mets sur ma TODO list
Lephenixnoir Hors ligne Administrateur Points: 22878 Défis: 149 Message

Citer : Posté le 23/09/2019 20:31 | #


C'est peut-être quelque chose à faire dans gint ça.
Milang Hors ligne Membre Points: 488 Défis: 2 Message

Citer : Posté le 29/09/2019 19:22 | #


J'ai un bug vraiment étrange
Alors voici une fonction d'affichage classique :

static void show_line(const log_line* l, int y)
{
    dtext(1, y, &l->text[0], C_BLACK, C_NONE);
}

void ll_display_custom(log_line* line)
{
    dfont(NULL);
    dclear(C_WHITE);
    for (int i=0; i<8; i++)
    {
#ifdef FX9860G
        show_line(line, 63 - 8*(i+1));
#endif
#ifdef FXCG50
        show_line(line, 224 - 13*(i+1));
#endif
        line=line->previous;
        if (!line)
            break;
    }
    dupdate();
}

void ll_pause()
{
    dclear(C_WHITE);
    log_line* line=current_line;
    while (1)
    {
        ll_display_custom(line);
        int key = getkey().key;
        if (key==KEY_UP)
        {
            log_line* linet=line->previous;
            if (linet)
                line=linet;
        }
        if (key==KEY_DOWN)
        {
            log_line* linet=line->next;
            if (linet)
                line=linet;
        }
        if (key==KEY_EXIT)
            break;
    }
}


Donc normalement la fonction ll_pause affiche le contenu du log à l'écran, et laisse ensuite l'utilisateur scroller jusqu'à ce qu'il presse <EXIT>

Cette fonction marche parfaitement dans le cas de figure suivant :
// des actions
                ll_pause();
// d'autres actions

Mais par contre n'affiche qu'un écran blanc dans le cas suivant :

if (event.key==KEY_F1 && event.type==KEYEV_DOWN)
{
ll_pause();
}

Cependant, le clavier est géré de la même façon, il faut appuyer sur <EXIT> pour sortir de la fonction, ce qui prouve qu'elle est bien lancée

Avez vous des pistes ? Je n'y comprends strictement rien, surtout au niveau de l'affichage .
Lephenixnoir Hors ligne Administrateur Points: 22878 Défis: 149 Message

Citer : Posté le 29/09/2019 19:26 | #


Est-ce que tu exécuterais pas ll_pause() dans une interruption dans le second cas ? La fonction dupdate() a besoin d'interruptions pour fonctionner correctement. Si c'est le cas, essaie dupdate_noint() qui est une gourouterie prévue pour ce cas précis.
Milang Hors ligne Membre Points: 488 Défis: 2 Message

Citer : Posté le 29/09/2019 19:35 | #


L'exécuter dans une interruption ? c'est à dire en cas d'exception ?

Je ne comprends pas, je fais les tests dans le même thread de calcul, c'est juste que avec le if rien ne s'affiche

Ajouté le 29/09/2019 à 20:00 :
Ah j'ai une autre piste, c'est la surutilisation de ram
Quand on envoie au delà d'un certain seuil de données, plus rien ne s'affiche
Lephenixnoir Hors ligne Administrateur Points: 22878 Défis: 149 Message

Citer : Posté le 29/09/2019 20:17 | #


L'exécuter dans une interruption ? c'est à dire en cas d'exception ?

Ça ou dans le callback d'un timer.
Milang Hors ligne Membre Points: 488 Défis: 2 Message

Citer : Posté le 04/04/2020 14:51 | #


En ces temps de confinement, j'ai remanié la lib
J'y ai ajouté:
- Un système de priorité complètement fonctionnel
- La fonction d'envoi supporte les arguments variable : En gros, si avant vous faisiez
char str[256];
sprintf(str, "le message %d %s", variable, "texte");
ll_send(str);

Maintenant tout se fait en une seule ligne :
ll_send(LEVEL_INFO, "le message %d %s", variables, "texte");

- Enfin, la quantité de ram est personnalisable à l'execution

Et enfin, voici un tutoriel pratiquement complet pour l'utilisation (que j'aurais du faire depuis longtemps )
> https://gitea.planet-casio.com/Milang/liblog/src/branch/master/README.md

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2023 | Il y a 58 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