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

Irrlicht Discussion :

drop et segfault


Sujet :

Irrlicht

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut drop et segfault
    Bonjour,

    J'ai un petit problème avec la méthode drop de irrlicht.
    Je la suspecte d'être à l'origine de segfault.

    En effet, j'ai eu des segfault au niveau de chargement de polices.
    Mais si je chargeait les polices avant de faire des drop sur des textures, je n'avais aucun problème.
    Si je remplace le drop par removeTexture, là encore pas de problème.

    Quand je fait le device->drop()J'obtiens :
    Citation Envoyé par GBD
    HEAP[ClientGUI.exe]:
    HEAP: Free Heap block 4ce0da0 modified at 4ce0db0 after it was freed
    while parsing target library list: not well-formed (invalid token)
    a la ligne du delete this de device->drop().
    Par contre avec device->closeDevise() je n'ai aucune erreur.

    Comment pourrais-je confirmer l'origine de la segfault?
    Dans quels cas doit-on utiliser drop()?
    J'ai vu qu'il y a removeTexture et drop, lequel faut-il mieux utiliser?

    Merci d'avance.

  2. #2
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Pour les textures "removeTexture ", car il supprime la texture du cache et drop la texture ensuite. Si drop est appelé directement, le cache de texture n'est pas nettoyé.

  3. #3
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Je précise que si il y a eu un grab en plus, il faut drop aussi la texture pour décrémenter le pointeur !

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Le fait de ne pas vider le cache de texture pourrait-il expliquer le segfault ?

  5. #5
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Oui cela pourrait.
    Mais c'est "une" parmis "n" raisons.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Sinon quelle est la différence entre device->closeDevice et device->drop?

    La deuxième version me provoque des segfaults, ou des messages du compilateur.
    Le problème avec les segfaults c'est que c'est très difficile de trouver l'origine de l'erreur...
    Il n'y a pas des programmes qui donnent directement les "débordements" ?

  7. #7
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    "closeDevice" ferme la fenêtre mais ne détruit pas l'objet.

    "drop", détruit l'objet si et seulement si le conteur est à 0.

    Donc il faut faire drop à la fin pour libérer la mémoire.

    Si boucle irrlicht standard avec "run", pas besoin d'appeler "closeDevice".

    Le "segfaults" vient surement d'un objet qui est libéré 2 fois.
    Il y a eu "1 grab" et "2 drops", le tiens et celui d'irrlicht à la fin.

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Je ne savais pas que run détruisait mon device.
    Au moins j'étais sûr de ne pas faire de fuites de mémoire

    Merci pour votre aide, je pense que j'ai résolu mon problème.

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Après le run il faut faire "drop" du "device".

    Si on quitte la fenêtre avec la flèche en haut à droite pour fermer celle-ci pas besoin d'appeler "closeDevice". Sinon il faut appeler "closeDevice".

    Donc soit:

    où (si on ne quitte pas graphiquement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    			dev->closeDevice(); // destroy window
    			dev->run(); // consume quit message
    			dev->drop();

  10. #10
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    D'accord, j'avais mal compris, je croyais que run() détruisait lui-même le device.
    Mais j'ai toujours le même problème, dès que je fait device->drop() juste après la boucle de rendu while (device->run() )
    HEAP[ClientGUI.exe]:
    HEAP: Free Heap block 4c07708 modified at 4c07718 after it was freed
    while parsing target library list: not well-formed (invalid token)
    EDIT : J'ai un font :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    irr::gui::IGUIFont *font = jeux->getGUI()->getFont("ressources/fontlucida.png");
    Si je ne met pas font->drop() le device->drop() fonctionne bien.

    Mais si avant le device->drop() je met les drop pour le driver, gui, sceneManager j'ai un segfault sur le delete this de device->drop()Irrlicht n'est pas vraiment intuitif je trouve...

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Oui je suis un peu d'accord avec toi, c'est la partie la moins simple d'irrlicht.
    Le mieux est d'encapsuler la plupart des fonctionnements de irrlicht et ensuite aucun problème

    Si je ne met pas font->drop() le device->drop() fonctionne bien.
    Donc là, cela signifie (si pas de leak) que irrlicht libère bien tout. Car irrlicht libère tout par défaut, si pas de "grab" de ton côté. Si tu ajoutes un "grab", alors il faut ajouter un "drop".

    HEAP: Free Heap block 4c07708 modified at 4c07718 after it was freed
    Indique 2 "free" sur le même pointeur.

  12. #12
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Si je comprend bien, le device->drop() peut provoquer des problèmes si je supprime les scenemanager, driver, gui avant de l'appeler, de toute façon il les supprimeras lui-même.

    font->drop()va provoquer des erreurs, de toute façon, même si j'ouvre plusieurs fois la même font, je ne l'aurait qu'une fois en mémoire et si je fait des drop(), je risque des segmentation fault car :
    - les boutons/zones de textes utilisant cette font n'auront plus la font.
    - la font reste dans la gui, donc quand je vais détruire le device, il va supprimer une deuxième fois la font.

    Dans ce cas là, pourquoi est-ce que la font a une méthode drop?

  13. #13
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Oui c'est cela.

    La font à une méthode drop comme tout autre objet irrlicht car si tu souhaites dans un cas bien précis, tu peux récupérer l'objet irrlicht et le garder pour toi.

    Exemple d'un mesh ou d'une texture ou d'une font.

    Si quelqu'un souhaite utiliser irrlicht comme un loader de mesh, de font ou d'image, mais qu'il ne souhaite pas qu'irrlicht libère les ressources après sa propre libération, il grab donc les data et indique à irrlicht de ne pas libérer les données.

    De même pour X raison, irrlicht charge des données et on souhaite les déconnecter pour les utiliser ailleurs.

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 209
    Points
    23 209
    Par défaut
    Merci pour votre aide.

    Mais je pense que mon problème de segmentation ne venait pas de là finalement.

    J'ai ajouté une image à la GUI et selon si je met le addImage dans la méthode appelée (ne contient que l'instruction addImage) ou que je le mette dans la méthode appelante je vais avoir un segfault au niveau de la gui->drawAll();.

    Je ne pense pas que ce soit un pointeur mal initialisé (ou libéré) ou que ce soit une erreur lié à des opération sur les pointeurs.
    Je pencherais plutôt à une erreur d'utilisation de Irrlicht.
    Est-ce qu'une personne pourrait jeter un coup d’œil rapide à mon code pour voir si je ne commet pas d'énormité sur utilisation d'Irrlicht?
    Je joint mon code par zip (il est pour l'instant uniquement compatible windows, je n'ai pas mis les #ifdef pour l'icône, il suffit de commenter ce bout de code), donc si quelqu'un veut y jeter un coup d’œil...
    Fichiers attachés Fichiers attachés

  15. #15
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Bonjour,

    Désolé, je n'ai pas assez de temps pour regarder votre code, le plus simple pour trouver ce genre d'erreur, c'est de tout commenter et de décommenter au fur et à mesure, dès que l'erreur apparait, on sait généralement d'où cela provient.

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

Discussions similaires

  1. Drag and drop "de l'extérieur"
    Par Invité dans le forum C++Builder
    Réponses: 12
    Dernier message: 31/03/2020, 11h10
  2. Comment faire un Drag&Drop vers Windows ?
    Par Lung dans le forum Composants VCL
    Réponses: 17
    Dernier message: 21/06/2004, 14h10
  3. Comment faire un Drag&Drop sur un tableau
    Par Stef.web dans le forum Composants VCL
    Réponses: 6
    Dernier message: 11/10/2003, 14h12
  4. drag and drop
    Par jujuesteban dans le forum Composants VCL
    Réponses: 5
    Dernier message: 20/06/2003, 10h23
  5. curseur et drag&drop
    Par Pierrot dans le forum Langage
    Réponses: 4
    Dernier message: 25/09/2002, 20h16

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