Espion pour trouver les bugs d'un programme

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 435 fois - Téléchargée 30 fois

Contenu du snippet

Voici une procédure qui va permettre "d'espionner" un programme écrit en delphi en écrivant les évenements et erreurs dans un fichier texte compatible Excel (.CSV).

Source / Exemple :


// La déclaration
procedure SaveLog(LeTexte:String);

procedure SaveLog(LeTexte:String); 
//------------------------------------------------------------------ 
// Sauvegarde les bugs et évenements dans un fichier texte 
// www.dfc-automatisme.fr 
//------------------------------------------------------------------ 
var 
  Fichier       : TextFile; 
  NomFichier    : String; 
  FichierDesti  : String;        
  LigneEcr      : String; 
  LigneLec      : String; 
  MS            : TMemoryStatus; 
  nLigne        : Longint; 
begin 
  NomFichier  := ExtractFilePath(Application.ExeName) + 'suivi.csv'; 
  nLigne      := 0; 

  // Création de la ligne a écrire 
  GlobalMemoryStatus(MS); 
  LigneEcr := DateToStr(Date) +';'+                               // Date 
              TimeToStr(Time) +';'+                               // Heure 
              TimeToStr((GetTickCount/1000)/(24*3600)) +';'+      // Temps de marche du PC 
              Format('%d %%', [MS.dwMemoryLoad]) +';'+            // Mémoire vive utilisée 
              LeTexte;                                            // Description 

  AssignFile(Fichier, NomFichier);      // Ouverture fichier 
  if not FileExists(NomFichier) then 
    Rewrite(Fichier)                    // Création du fichier si innexistant 
  else 
    Append(Fichier);                    // Mode ajout sinon 
  WriteLn(Fichier, LigneEcr);           // Ecriture de la ligne 
  
  Reset(Fichier);                       // Début fichier 
  While not Eof(Fichier) do              
    begin 
      ReadLn(Fichier,LigneLec); 
      Inc(nLigne);                      // Compte le nombre de lignes 
    end; 
  CloseFile(Fichier);                   // Fermeture fichier 

  // Après 1000 ligne on fait une copie de sauvegarde et on supprime le contenu du fichier courant 
  if nLigne > 1000 then 
    begin 
      FichierDesti := LeftStr(NomFichier, Length(NomFichier)-4)+FormatDateTime('_yyyy-mm-dd_hh-nn-ss".csv"', Now); 
      CopyFile(PChar(NomFichier), PChar(FichierDesti), False); 
      AssignFile(Fichier, NomFichier);      // Ouverture fichier 
      Rewrite(Fichier);                     // Supprime le contenu 
      CloseFile(Fichier);                   // Ferme le fichier 
    end; 
end;

// L'utilisation
SaveLog('DESCRIPTION');

// Exemple d'utilisation : 
  try 
    PortCom.Connected := True; 
  except 
    SaveLog('Impossible de connecter le port COM1'); 
  end; 

  if not FileExists(NomFichier) then 
    SaveLog('Fichier ' + NomFichier + ' introuvable'); 

// Aperçu du fichier : 
// 27/05/2004;15:40:03;07:22:04;78 %;Démarrage d'Easytrack 
// 27/05/2004;15:42:30;07:24:32;79 %;Fermeture d'Easytrack

Conclusion :


Le fichier courant se nomme suivi.csv et au bout de 1000 ligne une archive est créée sous la forme suivi_2004-06-01_10-40-00.csv pour éviter d'avoir de trop gros fichiers.
Si le fichier n'existe pas il est créé automatiquement.

Cette procédure me permet, en autre, de débugger les programmes et de connaitre la source des plantages (erreur de code ou manip client ).
Des questions ou plus d'infos sur http://www.dfc-automatisme.fr/forums/viewtopic.php?t=11

A voir également

Ajouter un commentaire Commentaires
Messages postés
1106
Date d'inscription
samedi 8 novembre 2003
Statut
Membre
Dernière intervention
3 septembre 2006
21
Et dire en fait qu'il y a plus simple encore:

uses Classes;
var STL : TStringList;

procedure OnChargement;
begin
STL.Clear; //pas nécessairement obligatoire
STL.LoadFromFile(LeFichier);
end;

procedure OnBug(Msg:string);
begin
STL.Add(LHeure+Msg);
end;

procedure OnSurLePointDeSeTerminer;
begin
STL.SaveToFile(LeFichier);
STL.Clear; //pas nécessairement obligatoire
end;

initialization
STL:=TStringList.Create;
finalization
STL.Free;
end.

Par contre, si l'EXE se plante royalement, le LOG n'est pas enregistré. Il faut savoir ce qu'on veut...
Messages postés
19
Date d'inscription
dimanche 22 octobre 2000
Statut
Membre
Dernière intervention
23 janvier 2008

Exact, on peux ensuite ajouter tout type d'infos dans le fichier
Messages postés
24
Date d'inscription
mardi 23 avril 2002
Statut
Membre
Dernière intervention
15 décembre 2009

Salut,g déjà implémenté un truc dans le genre,
un plus serait de ne pas oublier de grapiller le + possible d'infos pour une session de débogage.
except on e:exception do
SaveLog(Erreur dans NomProc() '
+'dans le bloc : trucmuche '
+'Message :'+e.Massage);
@+

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.