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 d'exécution programme C sous linux


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Points : 52
    Points
    52
    Par défaut Problème d'exécution programme C sous linux
    Bonjour,

    Je migre des programme en C écrit à l'origine pour un AIX vers un Linux suse 11 enterprise.

    Sous Aix le programme marche parfaitement mais sous Linux il me met une erreur "memory fault".

    J'ai lancé le gdb pour voir le problème mais je ne suis pas un pro en C.

    Voilà le code qui pose problème:

    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
    /*lecture d'une ligne de fichier*/
    int get_line (FILE *stream, char **pp_line)
    {
     
      void *line = NULL;
      char tmp[BUFSIZ] = "";
      size_t size = 1;
     
      /* Bug Integration sur fichier > 10 Mo */
      /* 17/12/2008 BLE Release memory allocation */
      /*free (*pp_line);*/
     
      if (stream != NULL && pp_line != NULL)
      {
     
        *pp_line = NULL;
        while (fgets (tmp, BUFSIZ, stream) != NULL)
        {
           /* printf("After fgets, BUFSIZ : %d\n", BUFSIZ); */
           /* printf("%s\n", tmp); */
     
          size += BUFSIZ;
          line = realloc (*pp_line, sizeof (**pp_line) * size);
          if (line != NULL)
          {
            /* printf("Begin line != NULL\n"); */
            if (*pp_line == NULL)
            {
              /* printf("Begin *pp_line == NULL\n"); */
              ((char *)line)[0] = '\0';
            }
            *pp_line = line;
            line = NULL;
            strcat (*pp_line, tmp);
            if ((*pp_line)[strlen (*pp_line)-1] == '\n')
            {
              (*pp_line)[strlen (*pp_line)-1] = '\n';
              break;
            }
          }
          else
          {
            /* printf("Begin else *pp_line == NULL\n"); */
            /*free (*pp_line);*/
            *pp_line = NULL;
          }
        }
      }
     
      return **pp_line;
    }
    et voilà ce que me dit le gdb mais je ne sais pas l'interpréter :

    Program received signal SIGSEGV, Segmentation fault.
    0x00000000004015e3 in get_line (stream=0x603250, pp_line=0x7fffffffdba0) at fncompare1.c:493
    493 return **pp_line;
    (gdb) bt
    #0 0x00000000004015e3 in get_line (stream=0x603250, pp_line=0x7fffffffdba0) at fncompare1.c:493
    #1 0x000000000040134d in main (argc=4, argv=0x7fffffffdde8) at fncompare1.c:409
    D'après ce que je comprend le pb est à la ligne 493 qui correspond à return **pp_line;

    Merci de votre aide

  2. #2
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2009
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2009
    Messages : 236
    Points : 491
    Points
    491
    Par défaut
    Bonjour,
    J'ai eu un problème similaire il y a quelques temps, qui venait de realloc avec lequel l'appel au cases du tableau par +n, -n plantait . J'ai du faire une copie de mon tableau et un réallocation avec malloc a chaque agrandissement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Points : 52
    Points
    52
    Par défaut
    je pense que le problème vient du buffer sur le pointeur. Car le buffer est alimenté par le pointeur. Ce qui est étrange c'est que sur mon AIX ca marche très bien.

    Voilà les bout de code qui pose problème:

    Voici le code appelant la fonction get_line
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     ret_prec = get_line(fp_fic_N_prec,&buffer_in2);
     
    if (ret_prec!=NULL)          /*( ret_prec >0 )*/
               {
                 sscanf (buffer_in2,read_format, begin_filler, &ln_dap_prec);
    }
    et celle présente dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int get_line (FILE *stream, char **pp_line)
     
    {size += BUFSIZ;
          line = realloc (*pp_line, sizeof (**pp_line) * size);
     
    return **pp_line;}
    Avez-vous une idée car je ne suis vraiment pas doué en C.

  4. #4
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 381
    Points
    5 381
    Par défaut
    **pp_line est un char.

    Le proto de la fonction est :
    int fct( ...)

    C'est pas le pb, mais c'est dégueulasse.

    si pp_line ou *pp_line est NULL, je crois que ca va planter.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Points : 52
    Points
    52
    Par défaut
    Ok Mais il s'agit d'un pointeur vers un char donc une adresse.

    Donc normalement il s'agit d'un int. Qu'elle serait l'autre possibilité pour que ca fonctionne

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 105
    Points : 52
    Points
    52

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 395
    Points : 23 756
    Points
    23 756
    Par défaut
    Citation Envoyé par sacan Voir le message
    Ce qui est étrange c'est que sur mon AIX ca marche très bien.
    Malheureusement, c'est un cas de figure très courant. Ton programme, en fait, « tombe en marche » sur ton AIX, parce que les accès qu'il fait à la mémoire restent incorrects mais tombe dans une zone couverte par le segment que le système lui a alloué. Si l'environnement change un tant soit peu (et l'occurrence il change beaucoup), le bug latent peut ressurgir à tout moment.

    Je me souviens avoir été dans la même situation que toi (Solaris vers Linux) et avoir dû reprendre le programme en entier pour l'adapter.

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par sacan Voir le message
    Ok Mais il s'agit d'un pointeur vers un char donc une adresse.

    Donc normalement il s'agit d'un int. Qu'elle serait l'autre possibilité pour que ca fonctionne
    Un entier n'est pas une adresse et une adresse n'est pas un entier

    Voilà la source du programme:
    ....
    Qui n'est pas du tout le code que tu as posté !

Discussions similaires

  1. Réponses: 9
    Dernier message: 24/04/2015, 12h36
  2. Exécution d'un programme java sous Linux
    Par chercheur111 dans le forum Linux
    Réponses: 1
    Dernier message: 24/04/2012, 13h59
  3. Réponses: 6
    Dernier message: 26/11/2008, 12h12
  4. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  5. Problème de creation de thread sous linux
    Par xilebo dans le forum POSIX
    Réponses: 4
    Dernier message: 27/10/2004, 09h58

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