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 :

NullReferenceException en release


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut NullReferenceException en release
    Bonjour, je programme sous visual studio 2003 une application concernant le son. Grossièrement il s'agit d'une interface graphique en .net(Framework .net) qui fait appel à des dll.

    Dans l'une des DLL appelée, il se produit une erreur curieuse uniquement en release, ça passe en debug.

    Je reçois une boite de dialogue qui m'explique qu'il s'est produit une NullReferenceException.

    J'active d'abord toutes les exception dans le débuggeur visual studio mais rien à faire, je n'arrive pas à reproduire l'erreur en debug.

    A l'aide de MessageBox j'identifie la ligne de code sur laquelle mon programme plante, en RELEASE. Il s'agit d'une bête allocation à l'aide de new :

    m_pRawBuffers = new AVRawDataBuffer[uNumBuffers];

    uNumBuffers vaut 1 (passé en argument)

    Je ne comprend pas cette erreur, je n'ai même pas le temps de vérifier la validité mon pointeur m_pRawBuffers que le programme crash.

    Une idée ? je cherche depuis plusieurs jours.

    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    J'ai tenté de catcher l'appel du new, le bloc catch est bien appelé. Il s'agit donc bien d'une erreur de l'operateur new. Seulement je ne comprend pas pourquoi. Mon PC dispose encore de 400-500mo de RAM avant chargement du fichier son.

    Si on écarte le manque de mémoire, quelle cause peuvent faire planter new ?

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ça peut être le constructeur de AVRawDataBuffer qui lance une exception, si l'erreur retournée est autre chose que std::bad_alloc...
    Sinon, faire du printf-debugging pour vérivier que uNumBuffers vaut bien 1 et non une valeur bizarroïde genre 0xCCCCCCCC...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    AVRawBuffer est une structure toute bête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct AVRawDataBuffer
    	{
    		void				* pBuffer;
    		struct AVRawDataBuffer	* pNextBuffer;
    		struct AVRawDataBuffer	* pPrevBuffer;
     
    		//Données pour utilisations diverses
    		DWORD	dwFlag1;
    		DWORD	dwFlag2;
    	}AVRawDataBuffer;
    uNumBuffer vaut bien 1, pas de soucis.

    De plus, le programme plante sur des new mais pas systématiquement sur celui là. je penche pour une corruption de la mémoire, je pense qu'il se produit quelque chose genre un dépassement d'indice de tableau. Le problème ne doit pas se trouver là mais bien avant.

    Quel outils puis je utiliser pour vérifier l'utilisation mémoire lors de l'éxécution en release ? Je sais que de tel outils existent mais je n'en connais aucun.

    Merci

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si c'est un dépassement de tableau, tu peux refaire la même chose en Debug et régler appeler une fonction de debug pour dire "vérification absolument systématique du tas". Cela rendra l'application encore plus lente que d'habitude en debug, mais les chances que la CRT détecte le "mauvais" buffer seront plus grandes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    As-tu déjà conscience du fait que cette structure est, typiquement, écrite en C

    En C++, ce serait, tout simplement (si le nom du type que tu veux utiliser pour cette structure est AVRawDataBuffer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct AVRawDataBuffer
    {
        void * pBuffer;
        AVRawDataBuffer * pNextBuffer;
        AVRawDataBuffer* pPrevBuffer;
     
    		//Données pour utilisations diverses
        DWORD dwFlag1;
        DWORD dwFlag2;
    };
    (il serait d'ailleurs peut être utile d'envisager une structure template, pour éviter cet horrible void * pbuffer )

    Cela ne change rien au problème, mais c'est plus dans une optique C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Si c'est un dépassement de tableau, tu peux refaire la même chose en Debug et régler appeler une fonction de debug pour dire "vérification absolument systématique du tas". Cela rendra l'application encore plus lente que d'habitude en debug, mais les chances que la CRT détecte le "mauvais" buffer seront plus grandes.
    Je ne comprend pas trop, on peut définir ça quelque part dans le debugger ? J'ai déjà activé toutes les exceptions avec "break into the debugger" mais sans succès ...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    Ah ok, tu parles surement d'appeler une fonction dans le try catch.

    Le problème c'est que le plantage est aléatoire.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Non, c'est une fonction qu'on appelle depuis le code.
    Un truc du genre _CrtSetDebugMode(), mais pas forcément celle-ci.
    Edit: _CrtSetDbgFlag() avec le flag _CRTDBG_CHECK_ALWAYS_DF. Voir le second exemple de code, juste avant la section Requirements.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    Malheureusement pour moi, ça ne change rien.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 87
    Par défaut
    Problème résolut, il s'agissait d'un alignement différent par défaut entre mes projets.

Discussions similaires

  1. regsvr32 failed en debug mais pas en release
    Par afan dans le forum DirectX
    Réponses: 1
    Dernier message: 09/06/2004, 10h32
  2. Condition sur debug et release
    Par xave dans le forum MFC
    Réponses: 3
    Dernier message: 04/02/2004, 15h04
  3. bloqué en mode Release
    Par matsch77 dans le forum MFC
    Réponses: 3
    Dernier message: 07/01/2004, 17h17
  4. Ma version release ne fonctionne pas
    Par totof42 dans le forum C++Builder
    Réponses: 2
    Dernier message: 25/11/2003, 13h15
  5. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10

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