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

MFC Discussion :

User Breakpoint en mode Debug !! Aucun pb en mode Release


Sujet :

MFC

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut User Breakpoint en mode Debug !! Aucun pb en mode Release
    Bonjour,

    J'ai 2 projets réunis dans un workspace :

    1) un projet "Win32 Console Application" : binbcxtp3
    2) un projet "Win32 Dynamic-Link Library" : liblcxxli

    binbcxtp3 utilise des fonctions de liblcxxli.

    Lorsque je lance mon programme en mode Debug, j'ai un "User breakpoint" et lorsque je lance en mode Release, je n'ai aucun problème.

    Je ne comprends pas pourquoi ? Cela m'empêche de debugger mon programme en se mettant en mode debug.

    Le code ci-dessous permet reproduire le problème :

    Projet binbcxtp3 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main(int argc,char *argv[])
    {
    	struct    SC_XLI01 *pXLI01;
    	struct    SC_SQL01 *pSQL01;
     
    	pXLI01 = pC_XLI_GetNewTabOf(4);
    	pSQL01 = (struct SC_SQL01 *) malloc(sizeof(struct SC_SQL01));
    	C_XLI_AddToTab_BC(pXLI01,(void *)pSQL01);
     
        C_XLI_DisposeTabWithFreePtrs(pXLI01);
     
    	return 0;
    }
    Projet liblcxxli :

    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
    22
    23
    24
    25
    26
    /* Alloue un tableau de pointeur */
    FCT_EXP struct SC_XLI01 *pC_XLI_GetNewTabOf(unsigned int _iNbPtrs)
    {
    	struct SC_XLI01 * scPtrRetour = NULL;
    	void **newPtrTab = NULL;
     
    	/* Allocation structure principale d'un tableau */
    	scPtrRetour = malloc (sizeof(struct SC_XLI01));	
     
    	/* Allocation des ptr de données */
    	newPtrTab = malloc(_iNbPtrs * sizeof(void *));	 
     
    	scPtrRetour->ptab = newPtrTab;
     
    	return scPtrRetour;
    }
     
    FCT_EXP void C_XLI_AddToTab_BC(struct SC_XLI01 *_scPtr,struct SC_SQL01 * _iPtrInsert)
    {	
    	_scPtr->ptab[0] = _iPtrInsert;		
    }
     
    FCT_EXP void C_XLI_DisposeTabWithFreePtrs(struct SC_XLI01 *_scPtr)
    {
    	free((struct SC_SQL01 *) _scPtr->ptab[0]);
    }
    Lorsque je lance en mode pas à pas mon prog, ca plante au niveau de la fonction C_XLI_DisposeTabWithFreePtrs.

    Je suppose que le fait :
    - d'allouer mon tableau de la DLL
    - et d'allouer un élément du tableau dans l'EXE
    - et de désallouer mon tableau et ses éléements dans la DLL

    pose problème car je n'ai AUCUN problème si je colle les fonctions de liblcxxli dans mon projet binbcxtp3.

    Quelqu'un a-t-il une idée ?

    Merci d'avance.

    Kévin.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    En debug, des vérifications sur l'utilisation de la mémoire sont faites pour trouver des erreurs. Si une erreur est trouvé, elle est signalée (appel du débogueur -> break point).
    En release, pour cause de performance, y'a pas de vérification de faite.
    Donc à priori tu as un bug dans ton code (double free, free d'une mémoire non allouée, ...). Normalement le débogueur devrait t'emmener à la ligne qui déclenche ce break point.

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    attention aussi au parametrage mono multi thread avec la CRT ,
    malloc fait dans le progr et free fait dans la dll.
    voir /MD

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    Aurelien.Regat-Barrel > Dans mon premier post, j'ai collé tout le code. Tu peux voir qu'il n'y a pas de problème mémoire, enfin je ne crois pas

    Par contre, j'ai mis mes deux projets en Multithreaded DLL (comme l'a suggéré farscape) et tout marche bien.

    Merci tout le monde

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    J'ai un nouveau problème après avoir remplacer deux lignes dans mon fonction MAIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(int argc,char *argv[])
    {
    	struct SC_XLI01 * pXLI01 = NULL;
    	FILE			* pFILE  = NULL;
     
    	pXLI01 = pC_XLI_GetNewTabOf(4);
    	pFILE = fopen("toto", "w");
    	C_XLI_AddToTab_BC (pXLI01, pFILE);
    	fclose (pFILE);
     
    	C_XLI_DisposeTab (pXLI01); 
     
    	return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    FCT_EXP void C_XLI_DisposeTab(struct SC_XLI01 *_scPtr)
    {
    	if ( _scPtr )
    	{
    		if ( _scPtr->ptab )
    			free ((void *) *_scPtr->ptab);
    		free( (void *) _scPtr);
    	_scPtr = NULL;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct SC_XLI01
    {
    	void **ptab;            /* Le tableau de pointeurs sur données */
    	unsigned int nbElem;    /* Le nombre d'éléments contenus dans le tableau */	
    	unsigned int nbMax;     /* La capacité courante du tableau */
    	unsigned int nbInit;    /* La capacité initiale du tableau */
    };
    Donc, au lieu d'ajouter un pointeur sur un objet SC_SQL01 (lequel j'ai alloué) dans mon tableau, j'ajoute un pointeur sur le handle du fichier toto.

    J'ai exactement le même problème qu'au début. Ca plante en Debug et pas en Release dans la fonction . J'ai bien mis mes projets en Multithread DLL mais rien n'y fait.

    Voyez-vous un problème au niveau de la gestion mémoire ?

    Kévin.

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut,
    tu sais que pour faire ce genre de boulot la stl est ton amie ?

    même si ton programme est en C ,tu peux placer le code de gestion du tableau dans la dll en c++.

    celle ci peut manipuler alors a loisir des tableaux dynamiques de type vector .
    cela simplifie grandement le travail et tu gagnes en securité .

    Vu le traitement que tu mets en ligne a mon avis c'est pas bien difficile à réaliser.

    voir faq c++: http://c.developpez.com/faq/cpp/?page=STL#STL_vector

    Note:si tu utilises les MFC dans ta dll ,tu peux aussi utiliser la classe
    CArray<>.


  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    Salut,

    Si je pouvais, je le ferais très certainement. Mais en fait, j'essaie de mettre en place l'utilisation du débugger VC++ sur un gros Progiciel (environ 50 DLL et 20 EXE).

    Parmis ces DLL, il y a liblcxxli créé, il y a des années, par des anciens collaborateurs. Cette librairie me permet de manipuler les tableaux de pointeurs à ma guise avec une quinzaine de fonctions différents (allocation, destruction, ajout, trie, ...).

    Mon but n'est pas de modifier le code pour ne plus utiliser cette librairie mais seulement de pouvoir compiler les projets sous VC++ et de lancer le debuggeur.

    Pour l'instant, j'arrive très bien à compiler tous mes projets mais le debuggeur plante systématique lorsque j'insére des handles de fichiers (FILE *) dans mon tableau XLI et que je désoulle le tableau.

    Avec ton aide, je n'ai plus le problème lorsque j'insère des objets créé pour mon entreprise (notre propres stuctures) mais ca plante toujours avec les handles.

    Ne voit-tu pas d'où pourrait venir ce problème ?

    Merci pour ton aide.

    Kévin

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    re,en principe en CRT multithread tu ne devrais plus avoir ce pb .
    essaye de faire ça :
    ouvrir le fichier et faire le traitement dans la dll ,
    du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //FILE    * OpenMyFile(const char *file) ;
    // CloseMyFile(FILE *pFile);
     
    FILE         * pFILE  = NULL; 
     
    pFILE=OpenMyFile("toto") ;
    C_XLI_AddToTab_BC (pXLI01, pFILE); 
     
    ///.........
    CloseMyFile(pFile);

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    re,en principe en CRT multithread tu ne devrais plus avoir ce pb .
    Quand tu parles de CRT mutlithread, cela veut juste dire qu'il faut seulement paramétrés la compilation de mes projets avec l'option /MD ?? car je n'ai fait que cela de plus.

    Je ne suis pas sûr d'avoir compris ton test. Il faut que je crée 2 fonctions dans liblcxxli appelées OpenMyFile et CloseMyFile qui me permettent de créer et de fermer un fichier ?? Est-ce bien cela ?

    Par ailleurs, aurais-tu une idée sur mes 2 questions posées sur ce post ? http://www.developpez.net/forums/viewtopic.php?t=365135

    Merci pour tout.

    Kévin

  10. #10
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas un probleme de thread, mais de CRT partagee via une dll. Elle faut qu'elle soit commune à tout le monde (exe, tes dll...), donc que tout le monde utilise la même CRT, en même version mono / multithread, mais avant tout en version dll.
    Sinon tu vas avoir plusieurs CRT de mélangées, et chacune gères sa mémoire. Faire un free sur un malloc fait avec une autre CRT ça fait boum.
    C'est facile de se vautrer car c'est pas lié au code mais à des options de compilation. C'est pour ça que c'est généralement une bonne pratique de masquer le malloc dans une fonction à part, idem le free, afin que ce soit toujours le "même binome" malloc/free (de la même CRT) qui soit utilisé. Je veux dire que dans ton cas par exemple le free est bien masqué dans C_XLI_DisposeTabWithFreePtrs, mais le malloc ne l'est pas. Il serait bon d'avoir une fonction genre C_XLI_Malloc située au même endroit que C_XLI_DisposeTabWithFreePtrs, et de l'utiliser à la place de malloc.

  11. #11
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    oui et pareil pour les fichiers d'ou ma proposition de faire des fonctions coté dll qui gerent l'ouverture /traitement/fermeture du fichier.

  12. #12
    Nouveau membre du Club
    Inscrit en
    Mars 2004
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    Points : 28
    Points
    28
    Par défaut
    Pour info, je viens de trouver la solution à mon second problème.

    Il y a une erreur dans la fonction C_XLI_DisposeTab : (sachant que c'est la fonction la plus utilisé du progiciel, je me demande bien comment cela n'a pas posé plus de problème )

    Il faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    free ((void *) *_scPtr->ptab); 
    par
    free ((void *) _scPtr->ptab);
    Le but était de désallouer le tableau sans désouller les pointeurs à l'intérieur. Or dans la première syntaxe, le traitement essayait de désoullé le 1er élément de mon tableau.

    Jamais je n'aurais pensé que leur librairie XLI utilisé depuis des années pouvait contenir une si grosse erreur. Par dessus le marché, j'ai même trouvé un second bug de la fonction qui réalloue le tableau lors de l'insertion d'un élément de la tableau.

    En tout cas, je vous remercie tous pour votre aide car depuis plus de deux semaines, je peux enfin utilisé le débuggeur de VC++.

    Bonne journée.

    Kévin.

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

Discussions similaires

  1. [DW 8 & antérieurs] Mode Debug et breakpoint
    Par elscorpio dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 22/02/2013, 12h08
  2. Réponses: 13
    Dernier message: 22/10/2010, 23h26
  3. Réponses: 13
    Dernier message: 23/06/2008, 08h50
  4. [Debug]Déclenchement intempestif du mode Debug
    Par Salam59 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 09/03/2006, 22h30

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