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 mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 91
    Par défaut Problème de mémoire
    bonjour,
    quelqu'un aurait t'il connaissance de cete erreur bien embetante que j'obtiens en executant mon projet de c sous cygwin :
    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
     
    Exception: STATUS_ACCESS_VIOLATION at eip=610DEBB4
    eax=00000030 ebx=0040319D ecx=0040319F edx=6116C421 esi=611021A0 edi=0040319F
    ebp=0022CC18 esp=0022CC0C program=C:\cygwin\home\Marc\PR301\Projet\central.exe, pid 2656, thread main
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame     Function  Args
    0022CC18  610DEBB4  (0040319F, 6116C420, 00000000, 00000000)
    0022CC38  610DEA65  (0040319D, 6116C420, 004031C8, 77DCC55A)
    0022CCA8  0040157F  (00404030, 00000000, 00000001, 00401715)
    0022CCE8  00401783  (00000004, 6116B7D8, 00660090, 0022CC70)
    0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
    61005510  61004416  (0000009C, A02404C7, E8611021, FFFFFF48)
         13 [main] central 2656 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
    Exception: STATUS_ACCESS_VIOLATION at eip=610DEBB4
    eax=00000030 ebx=0040319D ecx=0040319F edx=6116C421 esi=611021A0 edi=0040319F
    ebp=0022CC18 esp=0022CC0C program=C:\cygwin\home\Marc\PR301\Projet\central.exe, pid 3768, thread main
    cs=001B ds=0023 es=0023 fs=003B gs=0000 ss=0023
    Stack trace:
    Frame     Function  Args
    0022CC18  610DEBB4  (0040319F, 6116C420, 00000000, 00000000)
    0022CC38  610DEA65  (0040319D, 6116C420, 004031C8, 77DCC55A)
    0022CCA8  0040157F  (00404030, 00000000, 00000001, 00401715)
    0022CCE8  00401783  (00000004, 6116B7D8, 00660090, 0022CC70)
    0022CD98  61006198  (00000000, 0022CDD0, 61005510, 0022CDD0)
    61005510  61004416  (0000009C, A02404C7, E8611021, FFFFFF48)
        407 [main] central 3768 _cygtls::handle_exceptions: Error while dumping state (probably corrupted stack)
    je l'ai mise en code pour ne pas qu'elle prenne trop de place. J'ai également l'apparition d'un fichier .exe.stackdump je pense que c'est lié.
    Si quelqu'un peut m'aider je prend volontiers

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il y a un Access Violation à EIP=610DEBB4, le problème vient de ta fonction main. Donc nous montrer ton code pourrait peut-être nous faire avancer ... Apparament tu as un de débordement de tampon.

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 91
    Par défaut
    OK bah voila le code de mon main de ma fonction qui semble planter et en dessous le code du telephone pa rlequel je recouvre le processus
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <pthread.h>
    #include <stdlib.h>
    #include <semaphore.h>
    #include "../chaine/message.h"
     
    #define L 1
    #define E 0
     
    int central2igE,ig2centralL ;
    char * num_central ;
    sem_t test;
    int NB_Tel = 2;
     
    typedef struct Tablerout Tablerout ;
    struct Tablerout
    {
     char * num_tel ;
     int tel2centralL ;
     int central2telE ;
    };
    Tablerout rout[2] ;
     
     
    int find_pipedesc(char * destinataire) ;
    void creation_tel() ;
    void * reception_from_ig() ;
    void * reception_sms() ;
    void routage(char * message) ;
     
     
     
     
    /* fonction de traitement du message en fonction du numéro de téléphone*/
    void routage(char * message)
    {
     int desc ;
     char * sms;
     sms = message ;
     char * emeteur ;
     emeteur = (char *)malloc(10 * sizeof(char ));
     char * destinataire ;
     destinataire = (char * ) malloc(10* sizeof(char )) ;
     char * commande ;
     commande = (char *) malloc(6 * sizeof(char )) ;
     char * identifiant ;
     identifiant = (char *) malloc(4 * sizeof(char )) ;
     char * message1 ;
     message1 = (char *) malloc(225*sizeof(char )) ;
     
     printf(" ----------- routage du central -------------- \n" ) ;
     if(decoupe(sms,emeteur,destinataire,commande,identifiant,message1) != 0 )
     {
     printf(" Erreur de découpe du message \n" ) ;
     exit(1) ;
     }
     printf(" destinataire : %s\n", destinataire) ; 
     
      //si le destinataire appartient à cet opérateur on transmet au téléphone sinon on transmet au réseau intergalactique 
     
     if(destinataire[2] == num_central[0]  && destinataire[3] == num_central[1]) 
     {
      int indice = find_pipedesc(destinataire) ;
      desc = rout[indice].central2telE ;
     }
     else
    {
     desc = central2igE ;
    }
     
     write(desc , sms , strlen(sms)) ;
     printf(" sms transmis par le central \n" ) ;
     free(sms) ;
     free(emeteur) ;
     free(destinataire) ;
     free(commande) ;
     free(identifiant) ;
     free(message1) ;
     }    
     
    /* fonction permettant de lire le pipe depuis un tel */
    void * reception_sms()
    {
     int i = 0 ;
         while(1)
    {    
     
         int tel2central ;
         if((i %2) == 0) tel2central = rout[0].tel2centralL ;
         else tel2central = rout[1].tel2centralL ;
         sem_wait(&test) ;
         printf("-------------central from tel----------------\n") ;
         char * lu ;
         lu = (char * ) malloc(255 * sizeof(char )) ;
         read(tel2central,lu,255) ;
     
     
         printf(" message recu par le central %s  \n",lu) ;
         printf(" Etape de reception du sms par le central réussi \n") ;
         routage(lu) ;
         i ++ ;
         sem_post(&test) ;
    }
         return NULL ;
    }
     
     
    void * reception_from_ig()
    {
         while(1)
    {    
         sem_wait(&test) ;
         printf("-------------central from ig----------------\n") ;
         char * lu ;
         lu = (char * ) malloc(255 * sizeof(char )) ;
         read(ig2centralL,lu,255) ;
         printf(" message recu par le central %s  \n",lu) ;
         printf(" Etape de reception du sms par le central réussi \n") ;
         routage(lu) ;
         sem_post(&test) ;
    }
         return NULL ;
    }
     
    void creation_tel()
    {
    int central2tel[2] ;
    int tel2central[2] ;
     
    char * descE, * descL ;
     
     
    char * desc1;
    desc1 = (char *) malloc ( 2*sizeof(char));
    sprintf(desc1, "%d", tel2central[E]);
     
    char * desc2;
    desc2 = (char *) malloc ( 2*sizeof(char));
    sprintf(desc2, "%d", central2tel[L]);
     
    int central2tel2[2] ;
    int tel2central2[2] ;
     
    char * desc3;
    desc3 = (char *) malloc ( 2*sizeof(char));
    sprintf(desc3, "%d", tel2central[L]);
     
    char * desc4;
    desc4 = (char *) malloc ( 2*sizeof(char));
    sprintf(desc4, "%d", tel2central[E]);
     
    if (pipe(central2tel) == -1) 
    {
    perror(" erreur de création du pipe") ;
    exit(-1) ;
    }
     
    if (pipe(tel2central) == -1) 
    {
    perror(" erreur de création du pipe") ;
    exit(-1) ;
    }
    if (pipe(central2tel2) == -1) 
    {
    perror(" erreur de création du pipe") ;
    exit(-1) ;
    }
     
    if (pipe(tel2central2) == -1) 
    {
    perror(" erreur de création du pipe") ;
    exit(-1) ;
    }
     
    char * test ;
    test = strcat("06",num_central) ;
    rout[0].num_tel = strcat(test,"0301") ;
    rout[1].num_tel = strcat(test,"0302") ;
     
    rout[0].tel2centralL = tel2central[L] ;
    rout[0].central2telE = central2tel[E] ;
    rout[1].tel2centralL = tel2central2[L] ;
    rout[1].central2telE = central2tel2[E] ;
     
    int i = 0 ;
    for( i = 0 ; i < NB_Tel ; i++ )
    {
     if(i == 0)
    {
     descL = desc2 ;
     descE = desc1 ;
    }
    else
    {
    descE = desc4 ;
    descL = desc3 ;
    }
     
    char * telnum ;
    telnum = calloc(10, 10 *sizeof(char)) ;
    switch (fork())
    {
    case -1 : perror("erreur de forkage \n") ;
    	  exit(-1) ;
     
    case 1 : //execlp("xterm","xterm","-e", "tel.exe",descE,descL,telnum,NULL);
    	  execlp( "./tel.exe","./tel.exe",descE,descL,telnum,NULL);
    default : break ;
    }
    }
    }
     
    int find_pipedesc(char * destinataire)
    {
     int i = 0 ;
     for(i = 0; i<NB_Tel ; i++)
    {
     if(strcmp(destinataire,rout[i].num_tel) == 0)
     return i ;
    }
    return 0 ;
    }
     
     
     
    int main(int argc, char ** argv)
    {
     int desc1,desc2;
     pthread_t t1,t2 ;
     desc1 = atoi(argv[1]) ;
     desc2 = atoi(argv[2]) ; 
     num_central = argv[3] ; 
     printf(" le numero du central est %s \n",num_central) ;
     sem_init(&test,0,2);
     creation_tel() ;
     pthread_create(&t1, NULL, &reception_sms, NULL) ;
     pthread_create(&t2, NULL, &reception_from_ig, NULL) ;
     pthread_join(t1,NULL) ;
     pthread_join(t2,NULL) ;
     return 0;
    }


    et le téléphone
    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #include <unistd.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/types.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include "../creation_sms.h"
    #include "../chaine/message.h"
    char * num_tel ;
     
    int descE ,descL ;
     
    /* fonction d'envoi du sms au central via un pipe */
    void envoi(char * sms) 
    {
    size_t longueur ;
    longueur =  strlen(sms) ;
    printf(" longueur : %d \n" ,longueur) ;
    write(descE , sms, longueur+1) ;
    printf(" fin de l'envoi du sms \n") ;
    }
     
    /* fonction de création d'un sms */
    void * ecriture_sms()
    {   
    while(1) 
    {
    char * sms ;
    printf("ecriture \n") ;
    // sms =  malloc ( 255*sizeof( char ));  
    sms = creation_sms(num_tel,1) ;
    printf(" le message est : %s \n",sms) ;
    envoi(sms) ;
    sleep(30) ;
     
    }
    return NULL ;
    }
     
     
     
    /* fonction de reception d'un sms présent sur le central via un pipe */
    void * reception_sms()
    { 
    while(1)
    {
     char * sms ;
     sms =  malloc(255 * sizeof(char) ) ;
     char * emeteur ;
     emeteur = (char *)malloc(10 * sizeof(char ));
     char * destinataire ;
     destinataire = (char * ) malloc(10* sizeof(char )) ;
     char * commande ;
     commande = (char *) malloc(6 * sizeof(char )) ;
     char * identifiant ;
     identifiant = (char *) malloc(4 * sizeof(char )) ;
     char * message1 ;
     message1 = (char *) malloc(225*sizeof(char )) ;
     
     char * accuse;
     accuse = malloc(255 * sizeof(char)) ;
     
     printf(" -------------------reception------------ \n") ;
     
     
     read(descL, sms, 255) ;
     printf( " nouveau message : %s \n" , sms) ;
     printf(" --------------------fin de la reception -------------\n") ; 
     
     if(decoupe(sms,emeteur,destinataire,commande,identifiant,message1) != 0 )
     {
     printf(" Erreur de découpe du message \n" ) ;
     exit(1) ;
     }
     if(strcmp(commande, "SMS") == 0)
     {
     accuse = creation_accuse(sms) ;
     envoi(accuse) ;
     }
     
     free(sms);
     free(emeteur) ;
     free(destinataire) ;
     free(commande) ;
     free(identifiant) ;
     free(message1) ;
    } 
     return NULL ;
    }
     
    int main(int argc, char ** argv)
    {
     pthread_t  t1,t2 ;
     descE = atoi(argv[1]) ;
     descL = atoi(argv[2]) ;
     num_tel = argv[3] ;
     
     pthread_create(&t1, NULL, &ecriture_sms,NULL) ;
     pthread_create(&t2, NULL, &reception_sms,NULL) ;
     pthread_join(t1,NULL) ;
     pthread_join(t2,NULL) ;
     
     return 0 ;
    }

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Donc t'as saisi tout ce code avant de faire un premier test? T'as pas fait des tests unitaires? Tu ne peux pas situer à partir de quel moment tu as rencontré ce problème?

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 91
    Par défaut
    Bah j'avais aucun problème d'exécution quand je ne créais qu'un telephone et un serveur central mais depuis que je fais ma boucle de fork il a pas l'air d'adorer. En même temps j'ai rajouté une autre grosse partie qui est (sensé) être un serveur de routage. Ce serveur appelé intergalactique par le prof ,ig dans mon code crées mes serveurs centraux à l'aide du même genre de boucle et il ne semble y avoir aucun problème je pense que mon erreur vient de la fonction creation_tel mais je n'arrive pas à toruver où ni même pourquoi. Petite précision supplémentaire mon code téléphone n'a pas évolué d'une ligne depuis la dernière execution concluante.

  6. #6
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 91
    Par défaut
    Le plus bizarre c'est qu'apparemment sous un linux de vmware ça passe nickel...je pige pas la

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 Jonkile Voir le message
    OK bah voila le code de mon main de ma fonction qui semble planter et en dessous le code du telephone pa rlequel je recouvre le processus
    Ce code est incomplet et ne compile pas. Il y a 2 applications ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Août 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Août 2007
    Messages : 91
    Par défaut
    nan il est juste incomplet ya plein de fichiers mais le reste fonctionne sinon

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    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
     
    /* fonction de création d'un sms */
    void * ecriture_sms()
    {   
    while(1) 
    {
    char * sms ;
    printf("ecriture \n") ;
    // sms =  malloc ( 255*sizeof( char ));  
    sms = creation_sms(num_tel,1) ;
    printf(" le message est : %s \n",sms) ;
    envoi(sms) ;
    sleep(30) ;
     
    }
    return NULL ;
    }
    *Si la fonction creation_sms (non présentée) alloue de la mémoire pour contenir le message, il faut la libérer après l'envoi.

    *Si la fonction creation_sms n'alloue pas de la mémoire pour contenir le message, tu travailles avec un pointeur non initialisé.

    Ce serait bien de prévoir une condition de sortie.

    Il faudrait tester les retours des fonctions d'allocation et des write.

    Si j'ai bien tout suivi, tu passes en argument d'un programme des pointeurs sur une zone mémoire d'un autre programme. C'est obligé que ça plante.
    Pour partager de la mémoire entre plusieurs processus, il faut utiliser de la mémoire partagée.

    Si tu veut un peu plus d'aide, poste l'intégralité du code.

    Bonne continuation.

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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