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

C Discussion :

Segfault étrange sur un malloc


Sujet :

C

  1. #21
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par |PaRa-BoL
    Qu'est ce qui a pu provoquer un segfault ici ? Un overflow ailleur ?
    C'est tout à fait possible. Mais comme ton code est parfaitement bien conçu, donc modulaire, tu vas pouvoir repasser tous les tests unitaires et isoler le coupable facilement...

  2. #22
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    C'est tout à fait possible. Mais comme ton code est parfaitement bien conçu, donc modulaire, tu vas pouvoir repasser tous les tests unitaires et isoler le coupable facilement...
    c'est une affirmation moqueuse ?

    Je n'aurai pas cette prétention. Ce n'est qu'un petit projet personnel, je suis encore novice je pense avoir fait de mon mieux pour le moment :/ Mais je ne pense pas pouvoir tout reprendre à part.
    En disant que je ne pensait pas avoir de pointeur NULL ou que j'avait free() tout mes buffers, je ne voulais pas dire par la que c'était bien conçu, c'est juste que j'ai vérifié 500x :/

  3. #23
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 548
    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 548
    Par défaut
    1-je suis sceptique sur le code
    udeco = seek_user_fd(poll_list[i].fd, ace_tables);
    if (udeco != NULL && udeco->state == ALIVE) {
    udeco->state = ADIED;
    }
    si udeco retourné par seek_user_fd vaut 0 ou NULL c'est le plantage garanti.
    udeco=NULL et udeco->state vaut NULL donc tu ne peux pas adresser state sinon c'est le plantage garanti

    2-
    Citation Envoyé par |PaRa-BoL
    Qu'est ce qui ne fonctionnerai jamais correctement ?
    la synchronisation des différents événements , envoi /réception de données connection /déconnection utilisateur.

  4. #24
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    si udeco retourné par seek_user_fd vaut 0 ou NULL c'est le plantage garanti.
    udeco=NULL et udeco->state vaut NULL donc tu ne peux pas adresser state sinon c'est le plantage garanti
    Bah non regarde je verifi dans ma condition.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (udeco != NULL && udeco->state == ALIVE) {
    Et si udeco est NULL il essayera pas d'évaluer la deuxieme condition.


    la synchronisation des différents événements , envoi /réception de données connection /déconnection utilisateur.
    Mon t'chat n'est pas en streaming (oui il est prevu pour un client AJAX).

    Et quand bien même il sagirais d'un t'chat en streaming, je ne vois pas en quoi c'est génant que ca soit monothread à part des problèmes de lag.
    En effet si une personne se connect il executera le code et si une personne se deconnect en même temps elle est automatiquement mise en attente avec le system poll() et vu qu'il n'ya qu'un seul thread forcement 1 seule chose à la fois donc pas de probleme de synchronisation. Enfin du moins c'est comme ca que j'imagine la chose, je vois pas autrement Oo Et à l'inverse un systeme multi thread il faut bien veillé à proteger ces données partagées (MuTeX)

  5. #25
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 548
    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 548
    Par défaut
    Citation Envoyé par |PaRa-BoL
    Et si udeco est NULL il essayera pas d'évaluer la deuxieme condition.
    Ouuups tu as raison mea culpa je m'en suis rendu compte après coup

  6. #26
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mat.M
    1-je suis sceptique sur le code
    Il n'y a pas de quoi.
    si udeco retourné par seek_user_fd vaut 0 ou NULL c'est le plantage garanti.
    udeco=NULL et udeco->state vaut NULL donc tu ne peux pas adresser state sinon c'est le plantage garanti
    Non Cette construction est tout à fait sûre, car l'évaluation se fait de gauche à droite et qu'elle cesse dès que la condition est vérifiée. C'est garanti par le langage C et c'est utilisé à outrance.

    C'est comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f(char *s)
    {
       if (s != NULL && *s != 0)
       {
          ...
    }
    Ce qui est interdit, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void f(char *s)
    {
       if (*s != 0 && s != NULL)
       {
          ...
    }
    Là, effectivement, si s vaut NULL, comportement indéterminé garanti.

  7. #27
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 548
    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 548
    Par défaut
    ok merci pour les précisions

  8. #28
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par ShootDX
    Probablement plus de mémoire, ou quelque chose du genre (est-ce que tu as un moyen de voir l'utilisation mémoire de ton programme au fil du temps?). Tu dois revoir tes allocations et essayer de libérer la mémoire le plus tôt possible.
    Ce n'est pas que mon experience est exemplaire, mais un malloc qui echoue par manque de memoire je n'ai jamais vu ça de ma vie, c'est tellement excessivement rare comparé à la cause suivante :
    Un depassement ou un double free qui corrompt certaines données internes à la libc faisant echouer aleatoirement des malloc ou des free

  9. #29
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Gruik
    Ce n'est pas que mon experience est exemplaire, mais un malloc qui echoue par manque de memoire je n'ai jamais vu ça de ma vie, c'est tellement excessivement rare comparé à la cause suivante :
    Un depassement ou un double free qui corrompt certaines données internes à la libc faisant echouer aleatoirement des malloc ou des free
    C'est vrai, par exemple sous linux cela n'arrive jamais puisque le processus qui a fait la demande refusée est tué. Mais c'est sous Linux...

  10. #30
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par gege2061
    C'est vrai, par exemple sous linux cela n'arrive jamais puisque le processus qui a fait la demande refusée est tué. Mais c'est sous Linux...
    pas tout à fait correct…
    le programme est tué lors d'un malloc si le kernel ne peut étendre la mémoire déjà allouée au processsus…

    par contre malloc peut renvoyé NULL s'il peut étendre la mémoire MAIS sans garantie que les pages puissent effectivement être allouées plus tard…
    ce qui est peut être "rare"…
    toutefois cela suffit à justifier de tester si malloc renvoit NULL…
    la condition de rareté dépendant de l'environnement… notamment en 64 bits, les comportements risquent d'être différents…

    voir (en anglais)

  11. #31
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Pu***n, c'est gore

    Comment peut-on oser proposer ça dans un kernel qui a vocation à exclure Win32 et se répandre librement et gratuitement ?
    Et à quoi sert de spécifier que malloc() est supposé retourner NULL, si c'est pour tuer un process à la place?
    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.

  12. #32
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Médinoc
    Pu***n, c'est gore

    Comment peut-on oser proposer ça dans un kernel qui a vocation à exclure Win32 et se répandre librement et gratuitement ?
    Et à quoi sert de spécifier que malloc() est supposé retourner NULL, si c'est pour tuer un process à la place?
    Personne t'empêche de le faire mieux, la GPL est faite pour ça.

  13. #33
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par Médinoc
    Pu***n, c'est gore

    Comment peut-on oser proposer ça dans un kernel qui a vocation à exclure Win32 et se répandre librement et gratuitement ?
    Et à quoi sert de spécifier que malloc() est supposé retourner NULL, si c'est pour tuer un process à la place?
    lisez l'article
    et la doc de cette librairie

    vous comprendrez quand malloc() renvoit NULL et quand le processus est tué… et comment implémenter votre propre gestion de mémoire virtuelle côté "user"…

    tous les OS 32 bits sont limités à un espace mémoire de 4Gb qui est partagé entre les applications et le kernel… (classiquement 3/1 pour Linux…)

    donc si votre application a besoin de plus de 3Gb (en pratique 2Gb en continu est déjà un critère plus que suffisant…) soit vous passez au 64 bits, soit vous implémentez votre propre gestion de segv côté user space…

    (il fut une époque - peut-être encore ? - où Photoshop le faisait…)

    et Win32 n'est pas mieux loti de ce côté…
    et aucun autre OS 32 bits n'ont plus d'ailleurs…
    (seul Mac OS X offre une solution mais uniquement pour les programmes sans UI… ce qui signifie que pour un programme avec UI, il faut séparer le code 64 bits du code 32 bits et implémenter une IPC entre les deux pour communiquer données et résultats… ou attendre le X.5…)



    mais on s'éloigne du sujet du plantage à l'origine du thread…
    où les indices penchent quand même plus en faveur d'une corruption de la structure de données que d'un OOM…

  14. #34
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    The technical term for this is optimistic memory allocation.
    Je trouve qu'un tel optimisme n'est pas professionnel, surtout au vu des conséquences.

    Pour tout te dire, j'ignore si Win32 fait ça ou non, mais d'après les messages affichés sous XP, on dirait bien que non.
    Et je trouve que ça devrait être désactivable sous Linux.
    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.

  15. #35
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 964
    Par défaut
    Citation Envoyé par Médinoc
    Je trouve qu'un tel optimisme n'est pas professionnel, surtout au vu des conséquences.

    Pour tout te dire, j'ignore si Win32 fait ça ou non, mais d'après les messages affichés sous XP, on dirait bien que non.
    Et je trouve que ça devrait être désactivable sous Linux.

    sous Linux, c'est configurable … (Documentation/vm/overcommit-accounting)…

    quant au non-professionalisme de cette technique, c'est une réflexion qui n'engage que vous…

    les techniques d'allocation de type "optimiste" sont utilisées partout en informatique, du code du kernel des OS à l'allocation des locks dans les bases de données en passant par la gestion de la bande passante des réseaux…

  16. #36
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Après quelque recherche, j'ai trouvé une description qui correspond pas mal à mon probleme :

    fandango on core
    [UNIX/C hackers, from the Mexican dance] n. In C, a wild pointer that runs out of bounds, causing a {core dump}, or corrupts the `malloc(3)' {arena} in such a way as to cause mysterious failures later on, is sometimes said to have `done a fandango on core'. On low-end personal machines without an MMU, this can corrupt the OS itself, causing massive lossage. Other frenetic dances such as the rhumba, cha-cha, or watusi, may be substituted. See {aliasing bug}, {precedence lossage}, {smash the stack}, {memory leak}, {memory smash}, {overrun screw}, {core}.

  17. #37
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 26
    Par défaut
    À propos des allocations optimistes... c'est le principe même de la mémoire virtuelle
    En effet, on ne limite pas la place disponible à la vraie RAM du système, et on essaie d'avoir en rAM les blocs les plus souvent utilisés. Quand il n'y a plus de place on alloue de la "fausse" RAM que l'on stocke sur le disque dur. Afin de gérer ceci au mieux il faut n'allouer que ce qui sert vraiment, et donc partir du principe qu'un processus n'utilisera pas toute la ram qu'il demande (et il y a souvent dans le code des buffers de taille totalement arbitraire, etc)
    Un processus sera tué lorsque toute la mémoire (RAM et swap) est utilisée et qu'il veut en utiliser plus... ce qui pose un gros problème mais arrive très rarement (déjà sur mon pc j'ai du mal à remplir la ram...)

  18. #38
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 401
    Par défaut
    Ben non ce n'est pas "le principe même", puisqu'on peut très bien faire de la mémoire virtuelle sans...
    La place sur le disque EST libre dans le fichier d'échange, et si un processus demande trop, on peut poliment mais fermement lui refuser plutôt que de s'adonner au surbooking et lui dire plus tard "Ah, ben non, en fait la mémoire qu'on ta promis, on en a pas, et tu ne peux même pas repartir, puisqu'on va te tuer direct!"

    Là oui, si tu veux, on peut dire que l'allocation optimiste est le principe même des agences de voyages...
    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.

  19. #39
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 26
    Par défaut
    Si la mémoire était allouée comme les processus le demandaient, on se retrouverait très vite avec la RAM pleine et des tas d'opérations sur le disque dur pour swapper des morceaux vides ou inutilisés... disons que l'allocation optimiste ne coûte pas grand chose et aide pas mal à gérer tout ça
    Pour ce qui est de tuer les processus comme ça, je pense qu'on peut dire que si la swap est remplie, c'est qu'il y a un gros souci avec la mémoire et qu'il faut de toute urgence faire de la place. Il faut bien mettre quelqu'un dehors et là, ben c'est le premier qui réclame. De toutes façons, si ce processus n'a pas eu la mémoire dont il avait besoin, je doute qu'il puisse continuer son travail normalement autrement que de signaler une erreur et/ou de réessayer, ce qui ne vas pas vraiment aider àalléger le travail du système.
    De plus, l'allocation optimiste permet de gérer tout ça le mieux possible, puisque des blocs peuvent être alloués alors même qu'il n'y a de place réelle disponible nulle part.
    C'est vrai que c'est un peu violent mais bon, quand y'a plus de place il faut faire le vide à tout prix ... quand on est dans un tel cas c'est que vraiment tout à été tenté avant... d'ailleurs je ne pense pas que ça se produise souvent en pratique

Discussions similaires

  1. Segfault sur un malloc[Contourné]
    Par Alfrodull dans le forum Débuter
    Réponses: 3
    Dernier message: 08/01/2012, 18h27
  2. [MySQL] pb étrange sur mon site!
    Par mastercartman dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 23/03/2006, 19h38
  3. [xp] problème étrange sur le système de fichiers
    Par Huntress dans le forum Windows XP
    Réponses: 4
    Dernier message: 05/03/2006, 21h15
  4. blocage bizarre sur un malloc
    Par gilux dans le forum C
    Réponses: 13
    Dernier message: 24/01/2006, 10h36
  5. Erreur étrange sur recvfrom
    Par Gore dans le forum Développement
    Réponses: 2
    Dernier message: 17/02/2005, 13h22

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