Meilleure méthode pour debuguer une appli

Signaler
Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011
-
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
-
Bonsoir

Je développe un petit lecteur audio qui remporte un succès modeste mais pour moi pas négligeable (http://dekibulle.free.fr)
Sauf que je suis confronté a un problème (forcément ). Un certain nombre de personnes se plaignent d'un bug assez récurent de "indice de liste hors limite (0)".
De mon côté j'ai beaucoup de mal a reproduire ce bug et je n'arrive pas à localiser la source du prolème.

Ainsi je me demandais s'il serait possible de créer une sorte de log d'exécution histoire de cerner le problème.
D'où ma question: que pensez-vous d'un système qui enregistre les diverses opérations effectuées par le logiciel (notamment quelle procédure est en cours d'exécution, etc...)? Et quelle serait la meilleure méthode pour y parvenir?
Écrire un peu partout une ligne du genre :
If Debug then EcritLog('Procedure TForm1.LitChanson');
me semble très fastidieux! Serait-il possible de créer automatiquement ce genre de chose (une procédure lancée automatiquement a chaque opération du logiciel ou quelques choses comme ça) ?

Merci d'avance pour votre aide
A+
Fred

13 réponses

Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Perso je mets des WriteLn dans le code et j'active la console avec {$APPTYPE CONSOLE} dans le fichier projet, ensuite je regarde et j'essaye de voir où le code ne fait pas ce que je veux.

Au pire tu peux écrire un petit programme qui prend des fichiers source et écrive les procédures de log automatiquement dans le code, ensuite tu compiles le fichier source modifié. Mais c'est juste une idée.

Par contre, "Indice de ligne hors limites (0)" c'est quand tu accèdes au premier élément d'une liste qui ne contient aucun élément. En fait il faudrait toujours vérifier avec un truc du type "if Length(maliste) 0" ou "if listbox.items.count 0", enfin jpeux pas trop dire sans le code sous les yeux.

Cordialement, Bacterius !
Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011

Merci pour ta réponse!
Je ne peux pas vraiment utiliser la console parce que l'objectif serait que les utilisateurs puissent m'envoyer un log. La routine qui va modifier le code source ça peut être une solution effectivement. Genre après chaque début de procedure ou de fonction on va ajouter un writeln pourquoi pas.
Pour le bug en lui même le problème c'est qu'il y a tellement d'endroit où ça pourrait se trouver! Et de mon côté je n'ai quasiment jamais eu ce bug
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
Ha ok du côté des clients !
Ben euh oui je pense que faire une copie "debug" des sources avec tous les écritures log dedans que tu donnes à l'utilisateur et à qui tu demandes de te renvoyer "log.txt" ou un truc du genre (par contre utilise pas writeln sans console ^^).

Mais bon faudra toujours renseigner ce que le programme doit écrire dans le log, il ne peut pas le deviner. Donc à moins que tu n'aies vraiment pas le temps le mieux ça serait de passer une couche automatique d'écritures puis de rajouter les endroits délicats à la main.

Sinon tu peux aussi essayer des codes gratuits sur le net comme "delphi logging" dans google - tu as par exemple Smart Inspect et Raize Codesite qui vont faire ce que tu demandes et bien plus encore (copie des piles du registre en cas d'exception, etc ...).

Cordialement, Bacterius !
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Bonsoir

Au cas où cela t'intéresserais, j'utilise régulièrement le couple "fichier log" + "try except local" pour débusquer ce genre de problèmes.

Par exemple :

procedure TUsine.MiseAJourSuiviLignes;
var
  I,J : Integer ;
  S : String ;
begin
  J := 0 ;
  try
    for I := 0 to Lignes.Count - 1 do
    begin
      J := I ;
      Lignes[I].MiseAJourSuivi ;
    end;
  Except
    on E : Exception do
    begin
      S := Format( 'TUsine.MiseAJourSuiviLignes : Ligne [Index=%d] (%s)', [J, .Message] ) ;
      LogMessage( S );
    end;
  end;
end;



N.B. Après, libre à toi d'activer en permanence ou non le traitement fait dans la procédure LogMessage.

Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
1154
Date d'inscription
samedi 14 août 2004
Statut
Membre
Dernière intervention
5 avril 2012

Une erreur s'est glissée dans le code, il faut lire :

S := Format( 'TUsine.MiseAJourSuiviLignes : Ligne [Index=%d] (%s)', [J, E.Message] ) ;


Cordialement.[hr]"L'imagination est plus importante que le savoir." Albert Einstein
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
Salut,

C'est si difficile que ça à localiser ?

Tu ne dois pas avoir 100 listes dans ce genre d'application. Et c'est un accès à l'élément[0] d'une liste vide (probablement une TStringList) qui est en variable globale (sécuriser l'accès à cette liste dans les routines), ou alors une liste dans une boucle repeat (utiliser while ou for)...


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
4199
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
27
j'ai jetté un oeuil dans ta source ... houla ... ça necessite un bon netoyage et pleins d'optim.
mais bon le prog est jeune, c'est déjà pas mal fonctionnel,
bravo, continus sur cette lancée.

________________________________________________________
besoin de câbles audio, vidèo, informatique pas cher ?
Messages postés
60
Date d'inscription
jeudi 8 mai 2003
Statut
Membre
Dernière intervention
18 février 2011

ouaip je suis conscient de mes lacunes... mais je suis pas un pro dans le domaine, je fais ça a mes heures perdues et j'avoue que je ne sais pas trop par ou commencer pour faire un truc nickel propre
en plus je me dis que quitte a tout reprendre, autant passer sur un autre langage car j'ai l'impression de delphi n'est pas optimum (pas d'unicode, quelques fuites de mémoire, etc...)
Messages postés
3793
Date d'inscription
samedi 22 décembre 2007
Statut
Membre
Dernière intervention
3 juin 2016
7
pas d'unicode

Oui le support unicode est possible mais pénible avant les versions "modernes" de delphi (genre delphi 2005), après quoi il est intégré par défaut.

quelques fuites de mémoire

Pour ça le bug se trouve entre la chaise et le clavier (Delphi ne produit pas de fuite de mémoire par lui-même, c'est le code que tu lui ajoutes qui peut en provoquer si tu ne libères pas tes objets - si tu as l'occasion de lui parler, Cirec est un pro des fuites de mémoire avec son outil secret )

Cordialement, Bacterius !
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
11
De mon côté j'ai beaucoup de mal a reproduire ce bug et je n'arrive pas à localiser la source du prolème.

c'est normal, l'auteur d'un programme refait toujours les mêmes actions..
et il n'imagine pas un seul instant qu'un utilisateur puisse cliquer ici ou là et taper autre chose que prévu..

Ce sont donc les autres qui remontent les anomalies..

je rejoins Caribensila au vu du nombre impressionnant de TStringList utilisé dans le soft.

Avec quelques Try Except end bien placés et
un bon traitement d'erreurs..

Delphi n'est pas en cause dans ce problème.

cantador
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
« Cirec est un pro des fuites de mémoire avec son outil secret »


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Messages postés
1606
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
25 juillet 2014
10
pour info la version personnelle de DELPHI 2005 est toujours disponible à l'adresse:
DELPHI 2005

@+
JLEN
Messages postés
189
Date d'inscription
mercredi 29 décembre 2004
Statut
Membre
Dernière intervention
2 octobre 2014
1
@Jlen100

Le hic c'est que "Depuis février 2009, CodeGear/Embarcadero ne fournit plus de clé pour Delphi 2005 édtion Personnnel"

C'est dommage j'aurais bien fait la migration aussi.

Jean.