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++Builder Discussion :

Debugger un fantôme


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Debugger un fantôme
    Bonjour,

    J'ai un problème assez difficile à régler.

    J'ai un code où il semble avoir une variable mal initialisée ou traitée. Les symptômes sont les suivants :

    -Lorsque je ferme l'application bien souvent il me fait l'erreur suivant :

    +Access Violation at adress :... in module BXXXX.DLL

    +Enfin, violation d'accès standard, seulement elle s'effectue à la fin de tout.

    -Lorsque, j'effectue une séquence d'opération, la même erreur survient.

    -Je me mets des breakpoints et le problème ne semble pas venir de la ligne où le problème survient.

    -J'interchange la position de deux variables dans la déclaration exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString temp = "";
    AnsiString deuxiemeTemp = "";
    Devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AnsiString deuxiemeTemp = "";
    AnsiString temp = "";
    Et le programme passe par dessus l'ancien breakpoint sans broncher.

    -Je mets des grandes parties de code en commentaire, l'erreur disparaît. Je rejoute progressivement le code qui était en commentaire au code normal. Tout fonctionne jusqu'à un point qui ne me semble pas problématique. J'effectue quelque modification du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ShowMessage(AnsiString(i+1));
     
    devient
     
    tempo = AnsiString(i+1);
    ShowMessage(tempo);
    Et le problème est régler, mais survient à un endroit où avant il n'y avait pas d'erreur.

    Enfin, je semble traquer un fantôme... si quelqu'un connait un moyen de trouver la source...

    J'ai essayer avec CodeGuard, mais il me pointe toujours la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inFile.getline(temp, sizeof(temp));
    où
    char temp[256];
    il semblerait que cela soit un bug dans codeguard (selon ce que j'ai lu sur internet).

    Si quelqu'un a une idée...

    merci...

    antoine

  2. #2
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Tu peux essayer de nettoyer ton projet en supprimant tous les fichiers inutiles (*.obj, *.~*, *.tds, etc...) , et en recompilant ton application en entier.

    Vérifie également que tu travail sur les bons fichiers. Il m'est déja arriver de copier un projet ailleurs, et de travailler sur certaines anciennes sources sans m'en rendre compte et de passer des heures a tenter de trouver un problème où il n'y en avait pas.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    108
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 108
    Par défaut Bonne nouvelle!
    Bonjour,

    Merci sat83 d'avoir pris le temps de répondre.

    Il semblerait que le problème soit dans ma façon de coder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(temp.c_str(), QueryPorteTotal->FieldByName("Modele")->AsString.c_str());
    Ce code ne génère pas de problème lors du compilage. Il a été fonctionnel pendant un certain temps. Seulement, il ne fonctionne plus depuis un changement, dont je ne sait trop lequel.

    Le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char tempC[256];
    AnsiString modele = "";
     
    strcpy(tempC, QueryPorteTotal->FieldByName("Modele")->AsString.c_str());
    modele = tempC;
    me débarrasse de mes problèmes. J'avais utilisé cette formule à plusieurs reprise ce qui rendait mon problème difficile à cerner. J'ai pratiquement tout mit ce que je pouvais en commentaire en gardant seulement le stricte minimum, et à partir de là j'ai analysé tout le code restant, et c'est tout ce que je pouvait trouver d'étrange.

    C'est probablement un erreur de débutant, j'aimerais mieux comprend la raison qui m'empêche d'utiliser temp.c_str() dans la fonction strcpy.

    c_str() fonctionne pour la source, mais pas la destination?

    Enfin,

    Merci à tous,

    Antoine

    (J'espère ne pas trop vous avoir ennuyé avec mes bêtises)

  4. #4
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2005
    Messages
    401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 401
    Par défaut
    Hello,

    c_str() fonctionne pour la source, mais pas la destination?
    C'est presque ça.
    .c_str() te donne accès à la zone mémoire allouée par l'AnsiString pour stocker la chaîne. Le pointeur qu'il te donne est valide jusqu'à la prochaine modif de la chaîne.
    Si tu écris directement sur .c_str(), il faut être sûr que la zone mémoire déjà allouée est suffisament grande... Pour cela, .SetLength() te permet de "forcer" temporairement la taille de la chaîne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    AnsiString toto = "12";
    strcpy(toto.c_str(), "123"); // Marche pas
    AnsiString momo = "123";
    strcpy(momo.c_str(), "456"); // Sans intérêt, mais devrait marcher

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    c_str() renvoie un pointeur sur un tableau temporaire distinct.
    La meilleure façon de le comprendre est de considérer que le tableau est sur la pile (et non plus celui de l'AnsiString).

    A plus !

Discussions similaires

  1. [TP]debugger
    Par mmm dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 07/12/2003, 22h07
  2. [BPW]Exécution du debugger Windows sur un OS 32 bits
    Par Alcatîz dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 28/11/2003, 22h55
  3. [VB6] Comment Debugger une activeX ??
    Par Berns dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/05/2003, 17h34
  4. Debugger sous Linux
    Par Shadow Blade dans le forum Choisir un environnement de développement
    Réponses: 6
    Dernier message: 29/11/2002, 18h54
  5. Debugger 16-32 bits
    Par Mat dans le forum Assembleur
    Réponses: 4
    Dernier message: 28/06/2002, 11h34

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