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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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
    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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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
    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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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
    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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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
    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
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    37
    D�tails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 37
    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