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 :

EnumProcesses et SIGSEGV


Sujet :

Windows

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut EnumProcesses et SIGSEGV
    Bonjour,

    J'ai voulu testé les codes donnés dans les pages suivantes du MSDN :
    http://msdn.microsoft.com/en-us/library/ms682623.aspx
    http://msdn.microsoft.com/en-us/library/ms682050.aspx


    Problème : la fonction EnumProcesses provoque une erreur de segmentation.


    J'ai fait un code minimaliste que je compile avec Codeblocks 10.5 (et donc MinGW) sous Windows XP :
    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
    #include <windows.h>
    #include <psapi.h>
    #include <iostream>
    
    int main( void )
    {
        // Get the list of process identifiers.
        DWORD aProcesses[10000] = {0}, cbNeeded = 0;
    
        try
        {
            if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            {
                return 1;
            }
        }
        catch(const std::exception & Exp)
        {
            std::cerr << "Erreur : " << Exp.what() << ".\n";
            exit(EXIT_FAILURE);
        }
        return 0;
    }
    Le Try Catch ne sert à rien puisque la sortie est vide.

    Par acquis de conscience, je fais un code similaire en C :
    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
    #include <windows.h>
    #include <psapi.h>
    #include <stdio.h>
    
    int main( void )
    {
        // Get the list of process identifiers.
        DWORD aProcesses[10000] = {0}, cbNeeded = 0;
    
        puts("Avant");
    
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
        {
            puts("Erreur lors du listing !");
            return 1;
        }
    
        puts("Apres");
        return 0;
    }
    qui ne m'affiche que Avant.

    J'enquête à partir de la page de manuel de la fonction EnumProcesses : http://msdn.microsoft.com/en-us/library/ms682629.aspx

    Elle semble fonctionner sous XP, j'ai ajouté Psapi.lib à mon projet. Définir ou pas PSAPI_VERSION=1 ne change rien.

    Je suis preneur de toute piste ! Merci d'avance !

  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 519
    Points
    41 519
    Par défaut
    Ton problème est là. Utilise la macro ARRAYSIZE à la place de sizeof.

    PS: Je n'ai pas lu plus loin que le sizeof, donc il peut y avoir d'autres problèmes.
    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
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Jolie macro mais elle ne résout pas le problème...

    Après avoir essayer dans mon code avec MinGW et ne voir aucun changement, je suis allé sur la page de manuel et il est dit :
    cb [in]
    The size of the pProcessIds array, in bytes.
    sizeof() donne bien la taille en bytes (petite piqure de rappel, je croyais qu'elle rendait le nombre d'éléments )

    Du coup, j'ai lancé Visual Studio qui était installé par chance sur mon post, j'ai galéré comme un malade pour créer un projet vide, je n'ai pas réussi, j'ai finalement utilisé l'outil d'importation pour créer le projet à partir de mon code précédent. Il compile, se lance et ne plante pas.

    Impossible de le faire marcher avec MinGW par contre... Les fichiers LIB sont correctement interprétés par MinGW ? Tu n'avais pas dit une fois qu'ils étaient faits pour Visual ?

  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
    The size of the pProcessIds array, in bytes.
    Oups. Dire que j'avais commencé à vérifier, puis j'ai pensé à autre chose...

    En effet, les .lib sont fait pour Visual. MinGW utilise généralement sa propre version, généralement nommée libXXXX.a (ici, ce serait libpsapi.a).

    Sinon, tu peux essayer d'utiliser la version de ToolHelp au lieu de celle de psapi: CreateToolHelp32Snapshot(), Process32First(), Process32Next().
    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
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Dire que j'avais commencé à vérifier, puis j'ai pensé à autre chose...
    Ah ah ah ! Ça m'est arrivé des dizaines de fois ce genre d'égarement !


    En effet, les .lib sont fait pour Visual. MinGW utilise généralement sa propre version, généralement nommée libXXXX.a (ici, ce serait libpsapi.a).
    Parti de cette indication, j'ai rajouté libpsapi.a dans les options de mon linker (ce fichier est dans C:\Program Files\CodeBlocks\MinGW\lib, donc a priori sur le chemin du linker) et ça marche !

    Très étonnant quand même le comportement de MinGW quand tu lui indiques un fichier lib...

    1) Dans un premier temps, je lui ai indiqué le chemin complet vers le fichier en rajoutant aux options du linker :
    C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\Psapi.Lib
    Ca compile, ça linke, ça provoque une erreur de segmentation.

    2) Dans un second temps, j'ai copié Psapi.Lib dans le dossier de mon projet et j'ai indiqué aux options du linker uniquement le nom du fichier Psapi.Lib. Ca compile mais ça ne linke pas, avec le message d'erreur suivant :
    ld.exe||cannot find -lpsapi.lib|
    Étonnant aussi : quand tu vas dans les options du linker et ouvre le sélecteur de fichier, il t'autorise par défaut plusieurs extensions, donc les fichiers .lib.

    Bref, merci beaucoup à toi ! A l'avenir, méfions-nous des .lib avec MinGW




    PS :
    Sinon, tu peux essayer d'utiliser la version de ToolHelp au lieu de celle de psapi: CreateToolHelp32Snapshot(), Process32First(), Process32Next().
    Les fonctions de PSAPI sont-elles dépréciées ? J'ai lu sur un site que c'était uniquement pour NT 4.0 (qu'est ce que c'est exactement), pourtant la page de manuel de fonctions de PSAPI disent qu'elles sont encore utilisables dans Seven.

    ToolHelp est un remplaçant / un concurrent / autre chose ?

  6. #6
    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
    ToolHelp, c'est plus ou moins un concurrent qui existait dans Win16 et a été porté sous Win32.

    Il me semblait qu'il y avait quelque part un article sur l'histoire des deux, mais je ne le trouve plus.
    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.

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    J'y connais décidément rien aux versions de Windows ^^

    Merci pour ton aide, je marque le sujet comme .

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

Discussions similaires

  1. Déb prob avec EnumProcesses
    Par alainpeniche dans le forum Visual C++
    Réponses: 4
    Dernier message: 19/09/2007, 22h34
  2. Réponses: 15
    Dernier message: 15/04/2007, 13h31
  3. [Lazarus][Débutant] External error SIGSEGV
    Par MaYu070886 dans le forum Lazarus
    Réponses: 11
    Dernier message: 25/11/2006, 17h23
  4. EnumProcesses
    Par alainpeniche dans le forum Windows
    Réponses: 3
    Dernier message: 13/08/2005, 16h43
  5. [Kylix] SIGSEGV 11 - creation form
    Par pram dans le forum EDI
    Réponses: 1
    Dernier message: 29/08/2002, 15h24

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