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 :

Problème de core dump dans un malloc


Sujet :

C

  1. #1
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut Problème de core dump dans un malloc
    Bonsoir,

    J'ai un petit (gros) problème sur un projet sur lequel j'interviens en ce moment.

    Je travaille sur le portage (nouvelles versions de l'OS, du compilateur, du SGBD, etc.) d'un logiciel de plus de 10 ans, mal conçu, extrêmement mal écrit, en C.
    Depuis quelques semaines, certains appels à malloc provoquent une erreur de segmentation. Les traces que j'ai ajoutées, et l'examen des fichiers core, indiquent que le problème survient dans la fonction malloc elle-même. Ce n'est pas systématique, d'où mon problème, mais ça a l'air de se produire de plus en plus fréquemment.

    J'ai pensé que les paramètres étaient peut-être incohérents (malloc(0) par exemple), mais le man et quelques tests montrent que malloc renvoie bien NULL dans ces cas. J'ai pensé à un problème matériel, mais ça se produit sur plusieurs machines.
    Ca fait un moment que je cherche, en vain, une explication. Je me tourne donc vers vous en espérant que quelqu'un aura une idée lumineuse.

    Petite précision qui peut avoir son importance: L'OS est un AIX 64 bits, mais l'appli est compilée en 32 bits.

    Merci !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par zooro
    J'ai un petit (gros) problème sur un projet sur lequel j'interviens en ce moment.

    Je travaille sur le portage (nouvelles versions de l'OS, du compilateur, du SGBD, etc.) d'un logiciel de plus de 10 ans, mal conçu, extrêmement mal écrit, en C.
    Depuis quelques semaines, certains appels à malloc provoquent une erreur de segmentation. Les traces que j'ai ajoutées, et l'examen des fichiers core, indiquent que le problème survient dans la fonction malloc elle-même. Ce n'est pas systématique, d'où mon problème, mais ça a l'air de se produire de plus en plus fréquemment.

    J'ai pensé que les paramètres étaient peut-être incohérents (malloc(0) par exemple), mais le man et quelques tests montrent que malloc renvoie bien NULL dans ces cas. J'ai pensé à un problème matériel, mais ça se produit sur plusieurs machines.
    Ca fait un moment que je cherche, en vain, une explication. Je me tourne donc vers vous en espérant que quelqu'un aura une idée lumineuse.

    Petite précision qui peut avoir son importance: L'OS est un AIX 64 bits, mais l'appli est compilée en 32 bits.
    Ce genre de cas est difficile à résoudre à distance. Soit tu nous passes tout le code, soit il faut l'intervention d'un spécialiste sur place pour diagnostiquer le problème et faire un devis... C'est pas le genre d'opération qu'on confie à un débutant, mais celui-ci peut être le maitre d'oeuvre (gérer le sous-traitant).

  3. #3
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ce genre de cas est difficile à résoudre à distance.
    J'imagine

    Citation Envoyé par Emmanuel Delahaye
    Soit tu nous passes tout le code, soit il faut l'intervention d'un spécialiste sur place pour diagnostiquer le problème et faire un devis...
    Vous passer le code... mon client risque de ne pas apprécier, et en plus, c'est vraiment écrit n'importe comment (j'ai "corrigé" presque tous les malloc en ajoutant une vérification du retour (y a eu quelques surprises ), j'ai ajouté des traces (génial de débugger un serveur sans traces !), etc.).

    Bon, je crois que je vais essayer de leur vendre une réécriture partielle de l'appli

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par zooro
    J'ai pensé que les paramètres étaient peut-être incohérents (malloc(0) par exemple), mais le man et quelques tests montrent que malloc renvoie bien NULL dans ces cas. J'ai pensé à un problème matériel, mais ça se produit sur plusieurs machines.
    Ca fait un moment que je cherche, en vain, une explication. Je me tourne donc vers vous en espérant que quelqu'un aura une idée lumineuse.
    Personellement a froid, je pencherais plutot pour un debordement de buffer quelque part qui corrompt les donnees necessaires au gestionnaire de memoire.
    Tu devrait essayer d'utiliser un soft de supervision memoire (valgring, efence, mss, le module sysalloc d'Emmanuel, ou un truc du style) et tracer les debordement de memoire, dessalocation incorrecte, fuite de memoire, etc.

  5. #5
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par gl
    Personellement a froid, je pencherais plutot pour un debordement de buffer quelque part qui corrompt les donnees necessaires au gestionnaire de memoire.
    Tu devrait essayer d'utiliser un soft de supervision memoire (valgring, efence, mss, le module sysalloc d'Emmanuel, ou un truc du style) et tracer les debordement de memoire, dessalocation incorrecte, fuite de memoire, etc.
    Effectivement, c'est peut-être la cause du problème.

    Je crois que je vais suivre ton idée et ajouter un module de gestion de mémoire inspiré de celui d'Emmanuel.

    Merci !

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par gl
    Personellement a froid, je pencherais plutot pour un debordement de buffer quelque part qui corrompt les donnees necessaires au gestionnaire de memoire.
    Tu devrait essayer d'utiliser un soft de supervision memoire (valgring, efence, mss, le module sysalloc d'Emmanuel, ou un truc du style) et tracer les debordement de memoire, dessalocation incorrecte, fuite de memoire, etc.
    Attention, SYSALLOC vérifie les allocations (bilan, comptage, fuites), mais pas les débordements.

  7. #7
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Attention, SYSALLOC vérifie les allocations (bilan, comptage, fuites), mais pas les débordements.
    Ok. Ca sera toujours ça de vérifié.
    Je vais aussi remplacer les strcpy et strcat par des strncpy et strncat quand c'est possible (c'est tellement bien fait que parfois, je ne connais même pas la taille de la chaîne !).

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    si tu es sur *n*x tu peux utiliser purify......

    Ou ddd

    Les 2 ont des traces dynamiques (watch) de buffers alloués...

    Et je suis 100% OK avec le diagnostic de gl ..

    (débordement de buffer).

    Mais je rajouterais une note (ça m'est arrivé ) :

    libération dans des listes chaînées, dans des routines "parallèles", avec céations d'éléments des listes avec des routines provenant d'interruptions...

    Donc dans l'ordre je vérifierais :

    • que les tailles allouées dans les malloc/calloc sont correctes
    • que les additions/libérations dans les listes chainées sont OK
    • si des routines liées à des interruptions touchent des tableaux/listes dont la désallocation/allocation se fait ailleurs, et vérifier la concordance...

  9. #9
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par souviron34
    si tu es sur *n*x tu peux utiliser purify......
    Effectivement, après passage de Purify sur les sources, je me suis rendu compte que le problème provenait de plusieurs débordements qui, apparemment, corrompaient le gestionnaire de mémoire. Peut-être aussi un problème d'alignement. Ce n'était pas très clair.
    La taille calculée passée aux mallocs était cohérente avec celle des données, mais Purify indiquait un dépassement de 2 char.
    En augmentant la taille allouée de ces 2 chars, les erreurs de segmentation ont disparu.

    Encore merci de votre aide.

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

Discussions similaires

  1. Problème de Core dumped, Memory Fault
    Par pmboutteau dans le forum C
    Réponses: 26
    Dernier message: 26/03/2009, 16h07
  2. Problème dans le malloc et realloc
    Par ricomix2 dans le forum C
    Réponses: 6
    Dernier message: 08/03/2008, 07h54
  3. Problème de Core Dumped !
    Par KneXtasY dans le forum C
    Réponses: 8
    Dernier message: 24/12/2005, 13h11
  4. Problème d'ajout multiples dans un BDD Access
    Par arnaud_verlaine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/05/2004, 13h34
  5. Problème a l'affichage dans la console (printf)
    Par PhoneKilleR dans le forum C
    Réponses: 21
    Dernier message: 23/09/2003, 17h21

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