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 :

Memory fault à l'exécution


Sujet :

C++

Vue hybride

miketidy Memory fault à l'exécution 08/09/2008, 09h20
Invité Bonjour, Avez vous... 08/09/2008, 09h43
miketidy Merci pour votre réponse ... 08/09/2008, 09h57
loufoque débogué 08/09/2008, 10h21
Invité Vous pouvez commencer par... 08/09/2008, 10h23
miketidy Le problème est que le... 08/09/2008, 10h28
3DArchi Un bug était peut-être masqué... 08/09/2008, 14h28
miketidy J'ai peut-être trouvé de où... 08/09/2008, 15h14
Invité Ce bout de code n'est pas... 08/09/2008, 15h38
loufoque Dès que y'a des casts de... 08/09/2008, 15h50
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut Memory fault à l'exécution
    Bonjour,

    Voilà mon problème :

    Mon programme est exécuté sous linux et compilé via un makefile.

    Le programme fonctionnait jusqu'à présent en Oracle V8 (il y a du proC).

    Le moment est venu de passer à Oracle V10, donc je reprend mes soucres le makefile et je recompile. Après plusieurs essaie, le programme se compile sans erreur, mais voilà que quand je l'exécute il me met Memory Fault et sans le coredump entre parenthèse.

    J'ai lu par ci par là que cela pourrait être due a une erreur de programmation, je ne pense pas puisque ce programme fonctionnait avant.

    je compile avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(CPLUSPLUS) -o truc.exe $(USR_OBJ) -L$(LIBHOME) ${PROLDLIBS}
    $(USR_OBJ) étant les .o.

    Je ne sais pas de ou çà vient peut-être de la compilation?

    Pourriez-vous m'aider svp, je rame sur çà depuis des jours...

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Le moment est venu de passer à Oracle V10
    Avez vous sous la main la documentation qui explique les différences entre les version V8 et V10 ?
    Certaines functions/méthodes peuvent avoir un peu changé de comportement

    je compile avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $(CPLUSPLUS) -o truc.exe $(USR_OBJ) -L$(LIBHOME) ${PROLDLIBS}
    $(USR_OBJ) étant les .o.
    Les fichiers objets (.o) sont ils recompilés ?

    Après plusieurs essais, le programme se compile sans erreur, mais voilà que quand je l'exécute il me met Memory Fault et sans le coredump entre parenthèse.
    Avez vous intrumenté votre code pour savoir quelle(s) instruction(s) posai(en)t problème ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Merci pour votre réponse
    Avez vous sous la main la documentation qui explique les différences entre les version V8 et V10 ?
    Certaines functions/méthodes peuvent avoir un peu changé de comportement
    Malheureusement non, je n'ai pas cette documentation...


    Les fichiers objets (.o) sont ils recompilés ?
    Oui le objets sont recompilé, il y a du c++ et du ProC et c'est à mon avis la compilation du ProC qui pose problème voici commen je le compile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $(OBJ_DIR)/proc.o : $(SRC_DIR)/proc.pc $(USR_INC)
            @echo ""
            @$(PROC) $(PROCFLAGS) iname=$(SRC_DIR)/proc.pc
            @echo "Compilation proc"
            @$(CPLUSPLUS) -c -D_DEBUG -D__hpux -g $(CCFLAGS) $(INCLUDE) -o $(OBJ_DIR)/proc.o $(SRC_DIR)/proc.c
    avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCFLAGS=code=CPP mode=oracle parse=PARTIAL SQLCHECK=FULL release_cursor=yes userid=$(USERID) sys_include='($(SYS_INCLUDE))'  include=\(/usr/include,$(INC_DIR)\) lines=true ireclen=256 oreclen=256 DEFINE=VERSIONPROC21
    CCFLAGS = -g $(CPLUS_CFLAGS)
    Avez vous intrumenté votre code pour savoir quelle(s) instruction(s) posai(en)t problème ?
    C'est-a-dire? Qu'entendez-vous par instrumenté?

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    débogué

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par miketidy Voir le message
    Qu'entendez-vous par instrumenté?
    Vous pouvez commencer par ajouter des commentaires aux endroits susceptibles de poser problème.

    par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef NDEBUG
    cout << "avant création de pfoo" << endl;
    #endif
     
    Foo * pfoo = new Foo(bar);
     
    #ifndef NDEBUG
    cout << "si on lit ceci, c'est que le construction s'est bien déroulée" << endl;
    #endif

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Le problème est que le programme ne s'exécute pas donc comment fait pour voir ce qu'il ne fonctionne pas, j'enleve des fonctions et je vois si le programme s'exécute ou non?

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par miketidy Voir le message
    Le problème est que le programme ne s'exécute pas donc comment fait pour voir ce qu'il ne fonctionne pas, j'enleve des fonctions et je vois si le programme s'exécute ou non?
    C'est l'idée : trouver où ça coince.

    Par contre, un programme s'exécute toujours. Il n'a pas toujours accès à une console, mais il est toujours possible de conserver une trace de l'exécution dans un fichier log.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par miketidy Voir le message
    J'ai lu par ci par là que cela pourrait être due a une erreur de programmation, je ne pense pas puisque ce programme fonctionnait avant.
    Un bug était peut-être masqué avec la version antérieure d'Oracle et resurgit maintenant. Que le programme ait marché ne veut surtout pas dire qu'il était exempt de bug mais seulement que soit tu n'es pas tombé dessus, soit ses conséquences n'étaient pas immédiatement visibles.

    Dans ce genre de cas, effectivement, l'instrumentation est une bonne méthode. Commence par le début:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main(){
    cout<<"ouf! ca démarre";
    En fait, pour être exact, le début, ce sont les constructeurs de tes variables globales qui seront appelés avant le main. Donc une petite instrumentation de ceux-ci est aussi indispensable. Attention à bien instrumenter les classes parents, ainsi que les membres.
    Ensuite, tu raffines. Si ca démarre, ben, tu commence à instrumenter plus bas: "construction de mon premier objet", "initialisation de l'appli", "ouverture de l'IHM", etc.. jusqu'à découvrir le nœud du problème.
    Enfin, si tu le peux, la meilleure instrumentation, ce sont les point d'arrêts et un bon debugger.
    Bon courage.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    J'ai peut-être trouvé de où çà vient.

    Tout d'abord j'ai augmentait la taille du coredump pour avoir fichier core.

    Grace à ceci, il me donne une erreur de segmentation, voici la fonction qui est en erreur :
    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
    18
    19
    20
    21
    void CRequeteSql::GereCurseur()
    {
    if (numcursor)
        {
        short *toto;
        toto = (short *)sqlcud0 + 8 ;
        *toto = numcursor ;
        toto =(short *) sqlcud0 + 27 ;
        *toto = numcursor ;
        toto =(short *)sqlcud0 + 46 ;
        *toto = numcursor ;
        toto = (short *)sqlcud0 + 65 ;
        *toto = numcursor ;
        toto = (short *)sqlcud0 + 84 ;
        *toto = numcursor ;
        toto = (short *)sqlcud0 + 99 ;
        *toto = numcursor ;
        toto = (short *)sqlcud0 + 118 ;
        *toto = numcursor ;
        }
    }
    Je ne suis pas très fort en c++ et je n'ai pas fait ce programme donc je ne sais pas pourquoi il y a une erreur apperement une erreur d'allocation mémoire voici l'erreur donné dans le fichier core :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CRequeteSql::GereCurseur (this=0xfeff7bd4) at /devl/sap1/unix/src/psreq.pc:176
    176         *toto = numcursor ;
    Merci de m'aider

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Ce bout de code n'est pas très élégant...

    Que fait il ?

    on peut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        short *toto;
        toto = (short *)sqlcud0 + 8 ;
        *toto = numcursor ;
        toto =(short *) sqlcud0 + 27 ;
        *toto = numcursor ;
        toto =(short *)sqlcud0 + 46 ;
        *toto = numcursor ;
    De cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        short * toto = sqlcud0;
        toto[8] = numcursor;
        toto[27] = numcursor;
        toto[46] = numcursor;
    En fait, on un modifie les données d'un tableau qu'on sait être de type short[]. Ce tableau est pointé par sqlcud0.

    Ce qu'il faudrait savoir c'est ce qui se cache réellement derrière sqlcud0.

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Dès que y'a des casts de pointeurs de type reinterpret_cast, ça sent mauvais, forcément...

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Somme (Picardie)

    Informations forums :
    Inscription : Mai 2008
    Messages : 217
    Par défaut
    Ce n'est pas moi qui l'est programmé

    Je sais qu'il n'est pas très élégant,

    Je ne sais pas ce qu'est réelment sqlcud0, au début de la fonction, il y a tout de même un commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /* modifie la structure sqlcud0 creer par la precompilation pour
       faire correspondre le numero de curseur de l'instance */
    Cela vous parle ou non?

    Merci mabu je vais essayé ce que tu as mis.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de Core dumped, Memory Fault
    Par pmboutteau dans le forum C
    Réponses: 26
    Dernier message: 26/03/2009, 16h07
  2. [Mémoire] Probleme de Memory Fault louche
    Par wawa84 dans le forum C++
    Réponses: 1
    Dernier message: 23/11/2008, 20h53
  3. Memory fault avec une structure
    Par Neuromancien2 dans le forum C
    Réponses: 4
    Dernier message: 04/01/2008, 14h25
  4. Memory Fault
    Par melmouj dans le forum C
    Réponses: 67
    Dernier message: 20/09/2005, 10h27
  5. Memory fault(coredump)
    Par nono1 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2002, 17h26

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