IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Ecrire une donnee plus petite


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut Ecrire une donnee plus petite
    Salut,
    Je m'adresse à vous parceque je suis en train de développer une application dans le cadre d'un projet de FAC et le code commence à etre sufisemment conséquent .... malheureusement lors de l'execution il arrive un moment ou à chaque coup j'ai une erreure de segmentation le probleme c'est pour retrouver ou a lieu l'erreure de segmentation ......

    On nous enseigne linux donc j'ai d'abbord pensé à récupérer le signal SIGSEGV dans un handler pour logger le nom de la dernière fonction ayant créé le segfault ... malheureusement aparemment je n'ai pas trouvé le moyen de faire un equivalent windows donc j'ai opté pour un system de logger qui aurais pour objectif de conserver les 10 derniers appels par exemple dans un fichier et ainsi retracer le probleme.

    Par contre il est evident qu'il n'est pas raisonnable d'utiliser un stream étant donné leur comportement j'ai donc codé un petit logger tout simple à base de open() write() et close() ... les appels system quoi .... la seule chose c'est que lorsque j'écri dans mon fichier une donnée (un texte) de taille inférieure au précédent je me retrouve avec des signes tout bizards en fin de fichier (des restes de l'ancienne donnée je pense)... j'aimerais donc savoir comment faire pour ne pas avoir ce probleme ??? définir la nouvelle fin de fichier ?? ou je ne sais quoi ...

    Voila j'espère que vous pourrez m'aider
    en vous remerciant d'avance
    @bientôt
    Seb

  2. #2
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Salut,

    j'ai d'abbord pensé à récupérer le signal SIGSEGV dans un handler pour logger le nom de la dernière fonction ayant créé le segfault
    Peux-tu utiliser un débugeur pour retrouver ton segfault ?

    il n'est pas raisonnable d'utiliser un stream étant donné leur comportement
    Peux-tu être plus explicite ? Je ne vois pas à quoi tu fais référence, et je ne voudrais pas perdre une occasion d'apprendre.

    la seule chose c'est que lorsque j'écri dans mon fichier une donnée (un texte) de taille inférieure au précédent je me retrouve avec des signes tout bizards en fin de fichier
    Peux-t-on voir la fin de ton fichier, (si possible en hexadécimal) ?
    Peux-t-on voir le code qui te sert à écrire tes données ?

    Bonne journée

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Bon d'abord merci de ta réponse

    Pour le premier point honettement je n'ai jamais eu à utiliser un débugger car jusqu'à présent en réfléchissant un peu j'arrivais à trouver les erreures j'aurais donc besoin d'une petite explication quant à l'utilisation d'un tel outil.

    Pour ce qui es des stream par exemple cout pour n'en citer qu'un il est tout à fait probable par exemple que si j'ai le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cout << "avant ma commande" << endl;
    ...
    segfault
    ...
    cout << "apres ma commande" << endl;
    En utilisant cela il est tout a fait possible d'obtenir l'affichage de apres ma commande même en cas de segfault .....ou même de n'avoir ni l'un ni l'autre affichage ......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    void Tracer::Func(std::string nomF) {
         nomF += "\n";
         //int descripteur = open("Traceur.txt",O_CREAT | O_WRONLY);
         if( descripteur != -1 ) {
             // si l'ouverture àvait été  réussie
     
             // on se place en début de fichier
             lseek(descripteur, 0,SEEK_SET);
     
             write(descripteur, old1.c_str(), sizeof(char)*old1.size());
             write(descripteur, old.c_str(), sizeof(char)*old.size());
             write(descripteur, nomF.c_str(), sizeof(char)*nomF.size());
             // on termine l'utilisation
         }
         old1 = old;
         old = nomF;
    }
    Voila j'espère que vous pourrez m'aider
    Merci encore @+
    Seb

  4. #4
    Membre chevronné
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Par défaut
    Citation Envoyé par Sébastien P
    Pour le premier point honettement je n'ai jamais eu à utiliser un débugger car jusqu'à présent en réfléchissant un peu j'arrivais à trouver les erreures j'aurais donc besoin d'une petite explication quant à l'utilisation d'un tel outil.
    C'est assez pratique, et ça sert à faire précisément ce que tu veux faire. Plus un million d'autres choses.
    Sous quel environnement (compilateur + IDE) compiles-tu ? Il est possible qu'il en existe un intégré à ton environnement.

    En utilisant cela il est tout a fait possible d'obtenir l'affichage de apres ma commande même en cas de segfault .....ou même de n'avoir ni l'un ni l'autre affichage
    Vraiment ?
    J'avoue avoir du mal à comprendre. Normalement "endl" effectue un flush sur ton flux, ce qui devrait garantir, la mise à jour du flux même si le code après plante.
    Quand au fait que l'instruction qui suit ton segfault s'exécute, je veux bien croire qu'il s'agit d'une optimisation un peu trop optimiste de ton compilateur, mais sans cela j'ai du mal à comprendre.
    Peux-tu me diriger vers une document qui expliquerait ces phénomènes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int descripteur = open("Traceur.txt",O_CREAT | O_WRONLY);
    Je suppose que si tu as mis cette ligne en commentaire c'est que tu le fais ailleurs, probablement dans le constructeur de ta classe Tracer.

    Si je comprend bien ce que tu fais :
    - tu ouvre ton fichier
    - tu te replace au début et tu écris trois valeurs dedans
    - tu te replace au début et tu écris trois valeurs dedans
    - tu te replace au début et tu écris trois valeurs dedans
    - tu te replace au début et tu écris trois valeurs dedans
    ...
    - tu fermes ton fichier

    Dans ce cas là ton problème est normal. Il faut que tu remplace l'opération :
    "se replacer au début et écrire trois valeurs dedans" par
    "se replacer au début, écrire trois valeurs dedans et effaçer ce qu'il reste" ou
    "effacer tout le fichier et écrire trois valeurs dedans".

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Pour le compilateur j'utilise Dev C++ (sous windows) qui inclut je le sais un debuggeur mais je ne vois pas comment l'utiliser pour retrouver la methode qui effectue le segFault ??

    Ma remarque sur les stream m'avait été faite par mon professeur d'amphis sans véritable justification et je ne le croyé pas d'ailleur pour les mêmes raisons que toi..... mais j'ai pu en faire l'experience moi même sur les machine de travail qui tournent sous Fedora 5 et que j'avais compilée avec G++ donc de ce coté la je ne peut pas plus t'éclairer que en te disant que c'est une experience personnelle :p

    Pour ton analyse et tes supositions ur ma classe elles sont tout-a-fait exacte !!!! En fait je réécris par dessus parceque il faut un bon moment d'execution avant d'arriver au segfault et que je ne voulais pas me retrouver avec un fichier de je ne sais combien de Mo ....

    Donc le fonctionnement est exactement celui que tu as décrit et ma question repose exactement sur ce que tu sugéré de faire

    C'est à dire :

    "se replacer au début, écrire trois valeurs dedans et effaçer ce qu'il reste" ou
    "effacer tout le fichier et écrire trois valeurs dedans".

    effacer tout le fichier (et donc le recréer ??? ).... ca bouffe un peu beaucoup en fait si tu le fais à chaque appel de fonction non ? :p

    effacer ce qu'il reste ... oui ok mais comment ?? je dois avoir passé trop de temps dessu aujourd'hui que je ne voit mem plus l'évidence

    merci encore @+
    Seb

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Si tu as un core, et gdb d'installé, tu as gagné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $> gdb TonExecutable core
    (gdb) where
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/01/2011, 21h29
  2. Remplacer une chaîne par une autre plus petite
    Par qqoos dans le forum Cobol
    Réponses: 6
    Dernier message: 08/05/2009, 18h24
  3. Réponses: 6
    Dernier message: 18/02/2009, 18h16
  4. Win Server 2003 R2 - Restauration de ghost sur une partition plus petite
    Par super_boulet dans le forum Windows Serveur
    Réponses: 7
    Dernier message: 23/01/2009, 12h06
  5. Insérer une légende dans une image avec une police plus petite
    Par Paulinho dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 3
    Dernier message: 29/04/2006, 14h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo