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 :

DLL et consommation mémoire


Sujet :

Windows

  1. #1
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut DLL et consommation mémoire
    Bonjour à tous, j'ai un petit soucis épineux et aimerais votre avis.
    J'ai une application qui utilise une dll buggée (avec un mem leak régulier sans les sources).
    Actuellemnt je reboot le process serveur (service dont j'ai les sources) qui l'utilise toutes les nuits mais ca me chauffe un peu comme 1° technique.
    Je voudrais pouvoir surveiller la consommation de cette dll et passé un certain cap la décharger/recharger.
    J'ai utilisé un projet de test avec un dll qui simule la fuite mais toutes les fonctions que j'ai trouvées dans le msdn ne me permettent pas de n'avoir llocaliser la consommation mémoire par dlln c tjrs au niveau du processus.
    Any suggestions ..

  2. #2
    Membre averti Avatar de Jenna
    Inscrit en
    Décembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Décembre 2009
    Messages : 272
    Points : 339
    Points
    339
    Par défaut
    C'est normal, la mémoire appartient au processus, pas à la DLL

    Donc à la limite, tu peux surveiller ton process et le tuer s'il déraille.

    Par contre décharger et recharger une DLL, cela me parait un peux dangereux comme méthode.
    La valeur n'attend pas le nombre des années

  3. #3
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    décharger / recharger se font très facilement (même en env multith comme c la cas, je ne pratique que comme cela d'ailleurs), mais c le fait que la dll soit mappée dans la plage du processus qui rend justement la question épineuse ..
    peut être une possibilité en dumpant la mémoire du processus et forcant le chargement de la dll à une adresse pour limiter le calcul à partir de là ...
    continue searching ...
    mais merci de ta suggestion

  4. #4
    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 519
    Points
    41 519
    Par défaut
    Décharger la DLL ne libèrera pas la mémoire qu'elle aura allouée sur le tas du processus, à moins que la DLL ne contienne du code de nettoyage pour ça.
    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.

  5. #5
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    certes d'où le soucis de mieux cerner ce qui est consommé, arrêter / relancer le process serveur juste pour une dll me trouble,
    ou alors déporter le code dans un process annexe et communiquer avec lui en le surveillant, je cherche cherche la meilleure solution ...
    il faut mieux comprendre où cela se passe, me tourne vers les fonctions non documentées ou les autres ..
    merci

  6. #6
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    en fait même si la dll est chargée dans l'espace du processus appelant, elle possède son propre système de gestion de la mémoire, et le fait de la décharger libère la mémoire allouée.
    flagrant avec plusieurs compilo (vc/vs8/borland..) même résultat
    il ne reste plus qu'à tester ...
    code dll
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <windows.h>
    #include <iostream.h>
    #define _EXPORTDLL
    #include "dll.h"
    
    #define null  NULL
    #define dword DWORD
    BOOL APIENTRY DllMain (HINSTANCE hInst,     // Library instance handle. 
                           DWORD reason,       	//Reason this function is being called
                           LPVOID reserved)		// Not used    
    {
    	switch (reason)
    	{
    		case DLL_PROCESS_ATTACH:
    		break;
    
    		case DLL_PROCESS_DETACH:
    		break;
    
    		case DLL_THREAD_ATTACH:
    		break;
    
    		case DLL_THREAD_DETACH:
    		break;
    	}
    
    	// Returns TRUE on success, FALSE on failure 
    	return TRUE;
    }
    
    /*
    LIBRARY     DLL.DLL
    
    EXPORTS
        @__lockDebuggerData$qv         @2   ; __lockDebuggerData()
        @__unlockDebuggerData$qv       @3   ; __unlockDebuggerData()
        ___CPPdebugHook                @4   
        _testleak                      @1   
    */    
    
    DWORD WINAPI InstanceThread(LPVOID lpvParam);
    
    DLLEXPORT HANDLE testleakmem (HINSTANCE h)
    {
      DWORD  dwThreadId; 
      HANDLE hThread;
    	 
      hThread = CreateThread( 
                NULL,              // no security attribute 
                0,                 // default stack size 
                InstanceThread,    // thread proc
                NULL,    // thread parameter 
                0,                 // not suspended 
                &dwThreadId);
                
      return hThread;          
    }
    												
    DWORD WINAPI InstanceThread(LPVOID lpvParam) 
    {
     cout<<endl<<"thread:in";
     int z=0;
     dword t0=GetTickCount ();
    				
     while (1) 
      { 
        //cout<<endl<<z++; 
        Sleep(0);
        new int[1000]; //*********** MEM LEAK
        if (GetTickCount()-t0<5000) continue;
        break;
      }
     cout<<endl<<"thread:out";
    }

    code caller
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    int main(int argc, char *argv[])
    {
      HMODULE g_hmodule=GetModuleHandle(NULL); //null=this module
      HINSTANCE g_hinstance=(HINSTANCE)g_hmodule;
    
    
      MemStatus ();
      
      if (MountLibrary())
        {
           //ListProcess();
           hp=GetCurrentProcess();      //handle
           pid=GetCurrentProcessId();   //pid
           
           //MemStatus ();
           MemStatusEx ();
           HeapDump();
           PrintProcessNameAndID (pid);
           PrintMemoryInfo (pid);
           PrintModules (pid);
           
           GetProcessList(pid);
           //Sleep (60000);
           
           //OK from dll to pipo() function
           cout<<endl<<"library mounted";
           testleak=(pfntestleak)GetProcAddress (hdll, "_testleak");
           if (testleak)
             {
               testleak(g_hinstance); //OK
             }
             
            UnmountLibrary();
            cout<<"\nlibrary dismounted";
        }
    
    
       //loop which external function
       while (1)
         {
           if (!MountLibrary()) break;
             
           cout<<"\nlibrary mounted";
           testleakmem=(pfntestleakmem)GetProcAddress (hdll, "_testleakmem");
           if (testleakmem) 
            {
               HANDLE hth=testleakmem (g_hinstance);
               cout<<endl<<"-------------------------------------";
               WaitForSingleObject (hth,INFINITE);
               CloseHandle (hth);
               cout<<endl<<"+++++++++++++++++++++++++++++++++++++";
            }
              
           UnmountLibrary(); // processus mem returns at bottom
           cout<<"\nlibrary dismounted, wait ...";
           Sleep (5000);
         }
    
      return 0;
    }
    Images attachées Images attachées  

  7. #7
    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 519
    Points
    41 519
    Par défaut
    Avec la CRT dynamique? Vachement surprenant.
    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.

  8. #8
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    merci à tous ceux qui ont pris le temps de me répondre

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Si vous ne voulez pas corriger le problème de cette dll (réfléchissez-y quand même), le plus simple est de la charger dans un exécutable dédié et de lui demander (à l'exécutable) de se terminer au lieu de décharger la dll.

  10. #10
    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 519
    Points
    41 519
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Si vous ne voulez pas corriger le problème de cette dll (réfléchissez-y quand même).
    Je rappelle que r2d2abc a dit dans son premier message qu'il n'avait pas les sources.
    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.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    reverse-engineering.

  12. #12
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    aaaaah le fameux reverse engineering que ne ferions/serions pas sans lui ...

  13. #13
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    certes bacelar mais comment ce process dédié pourrait il communiquer/échanger des structures, ^, etc.. and co avec le process "maître" serveur tout en restant aussi performant qu'un appel call/jmp linké sur les fonctions de la dll même si les moyens ne manquent pas (ipc....) ?

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    On ne peut pas avoir le beurre et l'argent du beurre.
    Il existe de nombreux IPC, il faut prendre celui qui serait le plus simple avec des performances acceptables. Sur le papier, la mémoire mappé devrait être la plus rapide mais je serais plus sur une approche utilisant un serveur de composant COM out-of-process. Cela permettra toujours d'avoir la même sémantique d'appel de fonctions.
    Voir du surrogate de composant COM en dll.

  15. #15
    Membre habitué Avatar de r2d2abc
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 212
    Points : 179
    Points
    179
    Par défaut
    thank's bacelar, il n'y a pas de miracles donc
    merci pour tes propos

  16. #16
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par r2d2abc Voir le message
    thank's bacelar, il n'y a pas de miracles donc
    merci pour tes propos
    Juste pour savoir, c'est quelle DLL ? Ou quel genre ? Peut-être peux-tu trouver une autre bibliothèque approchée et faire les adaptations nécessaires…

    Sinon, tu peux essayer de tracer les appels systèmes faits par le code de ta bibliothèque. Peut-être trouveras-tu dans leurs arguments les combinaisons de valeurs qui la font bugger, et les contourner.

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

Discussions similaires

  1. [C#] probleme de consommation mémoire
    Par xtream dans le forum Windows Forms
    Réponses: 3
    Dernier message: 21/06/2006, 13h16
  2. [TStringGrid] Consommation mémoire
    Par spender dans le forum Bases de données
    Réponses: 4
    Dernier message: 09/03/2006, 21h48
  3. Dll et allocation mémoire
    Par charliejo dans le forum C++
    Réponses: 12
    Dernier message: 22/02/2006, 16h42
  4. [Consommation mémoire] Quoi utiliser pour trouver?
    Par doudine dans le forum Interfaces Graphiques en Java
    Réponses: 1
    Dernier message: 25/01/2006, 13h50
  5. Réponses: 4
    Dernier message: 09/11/2005, 13h32

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