Fichier de log

unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008 - 18 juil. 2008 à 14:29
 SAKingdom - 18 juil. 2008 à 23:03
Bonjour,

J'ai un petit soucis, je souhaite faire des stats dans mes méthodes pour cela j'ai crée un fichier de log (LogPerf), lequel j'appel a chaque entrée et sortie de méthode tout marche bien sauf pour une méthode :

// permet de construire le contenu de l'url qui sera renvoyé dans la methode POST
void ConstruireURL(char* composant)
{
    LogPerf("ConstruireURL", "E");
    if(temp!=NULL)
    {
        URL = strcat(temp,composant);                // si tampon existe deja, alors on concatene
    }
    else
    {
        URL = strcpy(temp,composant);                // si tampon est vide, alors on copie
    }
    LogPerf("ConstruireURL", "S");

}

mon appli doit se connecter lorsqu'en entrée je ne fait pas de log l'appli se connecte correctement mais lorsque je fais le log j'ai un refus de connection je ne comprend pas pourquoi l'appel et l'écriture dans le fichier empêche ma connection.

Code Fichier log :

int evenement=0;
void LogPerf(char* chain, char* sens) //j'ouvre le fichier au debut du WinMain
{
      //  char* logPerf="C:\\TMP\\logPerf.txt";   
     //    file_log = fopen(logPerf, "a");
        SYSTEMTIME now;
        GetLocalTime(&now);
        TCHAR heures[10];
       
        sprintf(heures,TEXT("%d"),now.wYear);
        fprintf(file_log, heures);
        fprintf(file_log, "/");
        sprintf(heures,TEXT("%d"),now.wMonth);
        if(strlen(heures)==1)
            fprintf(file_log, "0");
        fprintf(file_log, heures);
        fprintf(file_log, "/");
        sprintf(heures,TEXT("%d"),now.wDay);
        if(strlen(heures)==1)
            fprintf(file_log, "0");
        fprintf(file_log, heures);
        fprintf(file_log, " ");
       
        sprintf(heures,TEXT("%d"),now.wHour);
        if(strlen(heures)==1)
            fprintf(file_log, "0");
        fprintf(file_log, heures);
        fprintf(file_log, ":");
        sprintf(heures,TEXT("%d"),now.wMinute);
        if(strlen(heures)==1)
            fprintf(file_log, "0");
        fprintf(file_log, heures);
        fprintf(file_log, ":");
        sprintf(heures,TEXT("%d"),now.wSecond);
        if(strlen(heures)==1)
            fprintf(file_log, "0");
        fprintf(file_log, heures);
        fprintf(file_log, " ");           
        sprintf(heures,TEXT("%d"),evenement);
        fprintf(file_log, heures);
        fprintf(file_log, " ");
        if(strcmp(sens, "E")==0)
            fprintf(file_log, "E ");
            else
            fprintf(file_log, "S ");
       
        fprintf(file_log, chain);
        fprintf(file_log," ");
       
        MEMORYSTATUS ms;
        GlobalMemoryStatus(&ms);
        int memoire = ms.dwAvailPhys/1024 ;
        sprintf(heures,TEXT("%d"),memoire);   

        fprintf(file_log, heures);
       
        fprintf(file_log,"\n");
       
    //    fclose(file_log); le fichier je le close a la fin du WinMain
   
   
 
        evenement++;
}

Si une personne pouvais m'en dire plus !!
Dites moi si je ne suis pas assez clair ...

21 réponses

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 14:47
Bonjour,

Déjà ça au premier coup d'oeil :

void ConstruireURL(char* composant)
{
    LogPerf("ConstruireURL","E");
    if (temp != NULL)
    {
        // ici le tampon "temp" existe
        // et peut contenir n'importe quoi
        // au bout duquel (au 1er zéro binaire rencontré)
        // on concatène "composant"
        URL = strcat(temp,composant); // si tampon existe <strike>deja</strike>
    }
    else
    {
        // ici le tampon "temp" n'est pas vide
        // mais inexistant (adresse = NULL)
        // donc strcpy() va planter !
        URL = strcpy(temp,composant); // si tampon <strike>est vide</strike>
    }
    LogPerf("ConstruireURL","S");
}

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 14:53
mais alors pourquoi ça fonctionne lorsque je n'appelle pas le fichier log.

Et donc que dois je faire le strcpy.
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:03
temp et URL sont déclarés comment ?
Que voulez-vous dire par "je n'appelle pas le fichier log" ? les appels LogPerf() existent !

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 15:08
char* URL=NULL;
char* temp[2000];

LogPerf() est bien appelés dans le code que j'ai fournis, c'est justement mon gros problème si je mes en commentaire l'appel à l'entrée de la méthode tout se passe bien je n'ai pas d'erreurs de compilation et l'application se connecte correctement, en revanche et dans le cas ou je l'appel en début de cette méthode seulement la j'ai mon application qui à n problème à la connection..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:11
char temp[2000]; suffit !
temp est un tableau de 2000 caractères
et non un tableau de 2000 pointeurs de caractère(s).

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 15:14
Oui effectivement !!

Merci.

Mais j'ai toujours mon problème de connexion.
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:16
Et "URL" est bien un pointeur sur la chaîne retournée par strcpy() (qui sera systématiquement exécutée puisque "temp" existe et est donc toujours non NULL) c'est à dire que "URL" pointe "temp" qui contient la chaîne issue de "composant".

Jean-François
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:23
Et en essayant cette version plus concise de LogPerf() :

void LogPerf(char* chain, char* sens)
{
   // Fichier ouvert au début du WinMain
   // Fichier fermé à la fin du WinMain



   SYSTEMTIME now;
   TCHAR Texte[40];
   GetLocalTime(&now);
   sprintf(Texte,TEXT("%04d/%02d/%02d %02d:%02d:%02d %d %s ")
                ,now.wYear,now.wMonth,now.wDay
                ,now.wHour,now.wMinute,now.wSecond
                ,evenement++
                ,sens);
   fprintf(file_log,Texte);

   fprintf(file_log,chain);
       
   MEMORYSTATUS ms;
   GlobalMemoryStatus(&ms);
   int Memoire = ms.dwAvailPhys / 1024;
   sprintf(Texte,TEXT(" %d\n"),Memoire);
   fprintf(file_log,Texte);


}




Jean-François
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:26
Quand LogPerf() est activé et qu'il y a plantage, la trace dans le fichier log est cohérente ?

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 15:26
Oui je suis bien d'accord avec vous cependant je ne comprend pas pourquoi le fait d'appeler LogPerf() juste avant le test fait que l'appli me jette lors de la connexion..

j' appel  juste une méthode pourquoi agirait-elle sur cette tentative de connexion.
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:30
On peut penser à un débordement de mémoire qui corrompt les données qui suivent.

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 15:34
C'est possible parce quelque soit la fonction que je peu appeler dans cet méthodes avant le test me fait foirer la connexion.

Je ne sais vraiment pas comment je peu résoudre ce problème !!

merci
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 15:50
Et le fichier de trace contient quoi ?

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 16:15
date - heure - evement - nom - methode - memoire
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 16:23
Effectivement je viens de voir le contenu et tout à l'air correct.
Vous utilisez UNICODE ? (vu TCHAR et la macro TEXT dans LogPerf()) ?

Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 16:26
Oui j'ai deux métodes :

Unicode convert to ANSi
ANSI convert to Unicode

unsigned short*  ConvertAnsiToUnicode(char* szAnsi)
{
    LogPerf("ConvertAnsiToUnicode()","E");
    //Trouver la taille finale pour réserver le buffer
    int Size = MultiByteToWideChar (CP_ACP, 0, szAnsi, -1, NULL, 0) ;
    LPWSTR wUnicode[Size];
    //effectuer la conversion
    MultiByteToWideChar (CP_ACP, 0, szAnsi, -1, wUnicode, Size) ;
   
    LogPerf("ConvertAnsiToUnicode()","S");
    return wUnicode;
   
   
}

char* ConvertUnicodeToAnsi(TCHAR* wUnicode)
{
      LogPerf("ConvertUnicodeToAnsi()","E");
     
    int bTemp=(sizeof(wUnicode)/sizeof(TCHAR));
    int Size = WideCharToMultiByte(CP_ACP, 0, wUnicode, -1, NULL, 0, NULL, &bTemp) ;
    LPSTR szAnsi[Size];
    WideCharToMultiByte(CP_ACP, 0, wUnicode, -1, szAnsi, Size, NULL, &bTemp) ;

    LogPerf("ConvertUnicodeToAnsi()","S");      
    return szAnsi;
   
   
}
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 16:37
Et ça compile ???

int Size = ...
LPSTR szXXX[Size];

Impossible !
Size doit être une constante et non une variable. C'est pour ces cas là qu'il existe des new, malloc, calloc ... delete, free ...
En plus, si ça marchait, szXXX serait un tableau de pointeurs de chaînes (LPSTR = Long Pointer of STRing).



Jean-François
0
unlimited72 Messages postés 13 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 19 août 2008
18 juil. 2008 à 16:41
oui ça compile...

Ennfin en faite je reprend le code d'une application déjà créer, je suis en stage et je doit rectifier certains défauts donc je ne connais pas tout le code, l'application marche vraiment pourtant
0
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
18 juil. 2008 à 16:48
Quel est le compilateur qui accepte cette merveille ?

Jean-François
0
Original72 Messages postés 2 Date d'inscription vendredi 27 avril 2007 Statut Membre Dernière intervention 18 juillet 2008
18 juil. 2008 à 22:53
Dev C++
0
Rejoignez-nous