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

Windows Discussion :

Problème fuite mémoire


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    Bonjour,
    Je remarque dans le gestionnaire de tâches de windows que la mémoire utilisée par une de mes applications windows, augmente sensiblement. Mise à part les opérateurs "new" et "malloc" qui peuvent faire augmenter l'utilisation mémoire, y-a-t-il d'autres opérations qui pourraient produire les mêmes effets?
    Merci d'avance
    Devconf77

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Eh bien, tout ce qui crée quelque chose consomme de la mémoire. Y compris les ressources USER et GDI...
    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.

  3. #3
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 360
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 360
    Points : 20 376
    Points
    20 376
    Par défaut
    Citation Envoyé par devconf77 Voir le message
    Bonjour,
    utilisée par une de mes applications windows, augmente sensiblement. Mise à part les opérateurs "new" et "malloc" qui peuvent faire augmenter l'utilisation mémoire, y-a-t-il d'autres opérations qui pourraient produire les mêmes effets?
    Merci d'avance
    Devconf77
    Avec quoi sont développées les applications en question ?
    Il y a aussi les API Windows comme GlobalAlloc HeapAlloc etc..

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    J'ai une autre application où il y a des Heapalloc, qui présente également des fuites. Mais l'application que je traite en ce momment ne contient ni GlobalAlloc et ni HeapAlloc. elle Contient des fonctions SnmpMgrRequest, Openprocess, TerminateProcess, OpenService, StartService. Bref des fonctions pour envoyer des requêtes SNMP, pour gérer des processus et des services windows. J'ai remarqué après quelques mesures de consommation de mémoire autour de la fonction SnmpMgrRequest que cette dernière me prend de temps en temps 4ko sans jamais les rendre. Je ne sais pas comment régler ces problèmes de fuite.
    Merci d'avance pour toute aide
    devconf77

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    PS : Les applications sont développées avec visual c++ 6
    devconf77

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    La plupart des API qui retournent un handle allouent de la mémoire pour le handle.. Et donc un oubli de libération d'un handle (un CloseHandle() par exemple) peut à la longue être couteux...

    Donc vérifier que tous les appels retournant des handles sont toujours suivis par des libérations..

    Par exemple, OpenService() nécessite deux handles (un pour le manager un pour le service). Si ces deux handles ne sont pas fermés, il y a fuite mémoire...

    Donc revois ton code et tu trouveras les appels manquants
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 340
    Points : 177
    Points
    177
    Par défaut
    tu peux utiliser mpatrol pour savoir ou se trouve ta fuite memoire
    L'Opus attire les Prélats

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    A l'attention de vicenzo,
    A la suite d'un open..., je fais bien un CloseHandle. Donc le problème ne vient pas de là à mon avis.
    defconf77

  9. #9
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    ... Pourtant il y a bien une fuite... Et elle est forcement dans ton code.

    Utilise tu des librairies tierces ? (autres que win32)

    si besoin, je peux parcourir ton code afin de voir si y a pas une coquille quelque part..
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    Effectivement, j'utilise une librairie tierce (autre que win32). Je vais enlever les appels de fonctions de cette librairie et tester mon application
    Merci
    Devconf77

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    Voici un exemple d'appel de fonctions de l'api qui produisent des fuites de mémoire. Tu peux créer un projet console sous visual c++6, le compiler et l'exécuter. Ce petit programme obtient la taille mémoire utilisée par explorer.exe et l'affiche. Tu peux remplacer explorer.exe dans le source par une autre appli qui figure dans ton gestionnaire de tâches. Dans ce cas il faut aussi remplacer le chemin de explorer.exe par le chemin de l'appli que tu as choisie.

    #include <windows.h>
    #include <psapi.h>
    #include <stdio.h>

    void main()
    {
    char sProcName[MAX_PATH];
    strcpy(sProcName,"c:\\windows\\explorer.exe");
    strcpy(sProcName,"d:\\Program Files\\TDF\\SmipWatch\\SmipWatch.exe");

    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;
    HANDLE hProcess;
    HMODULE hMod;
    PROCESS_MEMORY_COUNTERS pmc;
    char sFileName[MAX_PATH];
    DWORD dwSize;

    // Isole le nom de l'exécutable sans chemin
    char sProcess[MAX_PATH];
    strcpy(sProcess, sProcName);
    char *pAntiSlash = strrchr(sProcName,'\\');
    if(pAntiSlash)
    {
    pAntiSlash += 1;
    strcpy(sProcess,pAntiSlash);
    }
    for(i = 0; i < strlen(sProcess); i++)
    {
    sProcess[i] = tolower(sProcess[i]);
    }

    int intCount = 0;

    while(1)
    {
    // Get the list of process identifiers.
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    return;

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    for ( i = 0; i < cProcesses; i++ )
    {
    // Get information about the process.
    hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
    PROCESS_VM_READ,
    FALSE, aProcesses[i] );
    if (hProcess)
    {
    if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &dwSize))
    {
    // Get the module name
    if (GetModuleBaseName(hProcess, hMod, sFileName, MAX_PATH))
    {
    for(int j = 0; (size_t)j < strlen(sFileName); j++)
    {
    sFileName[j] = tolower(sFileName[j]);
    }

    if(strcmp(sFileName,sProcess) == 0)
    {
    // Get memory info
    if ( GetProcessMemoryInfo(hProcess, &pmc, sizeof(pmc)))
    {
    intCount++;
    printf("%d-Memoire utilisee par %s = %u\n",intCount,sFileName,pmc.WorkingSetSize);
    }
    }
    }
    }
    CloseHandle( hProcess );
    }//End if
    }//End for
    Sleep(2000);
    }//End while

    return;
    }

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Points : 38
    Points
    38
    Par défaut Problème fuite mémoire
    Dans le message précédent, il faut SUPPRIMER l'instruction : strcpy(sProcName,"d:\\Program Files\\TDF\\SmipWatch\\SmipWatch.exe");
    Merci

  13. #13
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Bon, j'ai testé ton code (tiré de la msdn, si je ne m'abuse...) et sous ma config (VISTA / VS2005) j'ai effectué 17 000 itérations (toutes les 10 ms soit avec ta boucle de départ l'equivalent de 944 heures de ta boucle et pas un seul souci de mémoire....

    C'est quoi ta config ?

    PS : les deux boucles avec un strlen à chaque tour boucle pour tester la onguer de la variable qui ne change pas... inutile, perte de temps et a éviter !!!!!!
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

Discussions similaires

  1. Problème fuite mémoire
    Par vince29 dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 07/08/2012, 16h38
  2. Réponses: 5
    Dernier message: 06/07/2011, 15h35
  3. Problème fuite mémoire
    Par scary dans le forum Débuter
    Réponses: 1
    Dernier message: 03/08/2010, 11h33
  4. problème fuite mémoire
    Par didoboy dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 29/07/2009, 11h46
  5. Problème fuite mémoire
    Par devconf77 dans le forum Windows
    Réponses: 3
    Dernier message: 30/08/2007, 18h33

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