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 :

Segmentation fault au lancement du programme


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut Segmentation fault au lancement du programme
    Salut tout le monde!!!
    Alors non ca n'est pas encore un de ces segmentation fault bidon...
    Là le segmentation fault se déclenche dès le début du code. Je me suis dit que cela venait d'un problème de tableau.. je vérifie, je met des tableau avec 5 case... ca change rien, je différencie les affections des déclaration du type int i=100... toujours aucun changement.

    Je change deux trois variable de place, pas de changement...

    Ce qui me parait bizarre est que je n'ai aucun message d'erreur, enfin si des warnning avec des str_cpy.. mais avant mon code marchait du feu de dieu. Et du jour au lendemain.. plus rien...

    Vous auriez pas des idées?

    au fait je suis sous linux

    Merci

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Poste ton code!!!!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    le code en question fait plus de 400 lignes... mais voilà les 150 premières lignes (deux fonctions + déclarations des variables).
    Avec un printf avant les déclaration segmentation fault, sans ce printf .. pareil...

    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
     
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <string.h>
    #include <pcap.h>
    #include <pcap-bpf.h>
     
    #include <netinet/in.h>
    #include <net/ethernet.h>
    #include <netinet/ether.h>
    #include <netinet/ip.h>
     
    char **str_split(char *s, const char *ct)
    {
    	char **tab=NULL;
     
    	int i;
    	char *cs=NULL;
    	size_t size=1;
    	void *temp=NULL;
     
     
    	if(s!=NULL && ct != NULL)
    	{
     
    		for(i=0; (cs=strtok(s,ct)); i++)
    		{
    			if(size <=i+1){
     
    				size <<=1;
    				temp=realloc(tab,sizeof(*tab) * size);
     
    				if(temp!=NULL){
    					tab=temp;
    				}
    				else{
    					fprintf(stderr,"mémoire insffisante\n");
    					free(tab);
    					tab=NULL;
    					exit(EXIT_FAILURE);
     
    				}
    			}
     
    			tab[i]=cs;
    			s=NULL;
     
    		}
    		tab[i]=NULL;
    	}
     
    	return tab;
    }
     
    char *rebuild_mac(char **mac_digit){
     
    	int index_temp=0;
     
    	char mac_address[20];
     
    	strcpy(mac_address,"\0");
    	while(index_temp <6)
    	{
    		if(index_temp!=0 && index_temp<6){
    			strcat(mac_address,":");
    		}
     
    		if(strlen(mac_digit[index_temp])<2)
    		{
     
    			strcat(mac_address,"0");
    			strcat(mac_address,mac_digit[index_temp]);
    		}else{
    			strcat(mac_address,mac_digit[index_temp]);
     
    		}
     
    		//printf("Temp : %s -> taille : %d  index_temp : %d\n", mac_address,strlen(mac_address),index_temp);
    		index_temp++;
    	}
    	//printf("Fin dela boucle while\n");
    	return mac_address;
    }
     
     
    int main(int argc, char **argv)
    {
     
    	//printf("Point d'arret");
     
    	pcap_t *desc;
    	pcap_t *desc_save;
    	struct pcap_pkthdr hdr;	
    	struct bpf_program bp ;
    	struct ethhdr *EtherHdr;
    	struct ip *IpHeader;
    	bpf_u_int32 netmask=32;
    	FILE *fp;
     
    	const u_char *packet;
    	char **temp;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	char * buff =NULL;
    	char *save_temp;
    	char *fichier_pcap = argv[1];
    	char mac_address_src_1[20];
    	char mac_address_dst_1[20];
    	char mac_address_src_2[20];
    	char mac_address_dst_2[20];
    	char previous_mac_address[20];
    	char mac_AP[20];
    	char ip_address_src_1[20];
    	char ip_address_dst_1[20];
    	char ip_address_src_2[20];
    	char ip_address_dst_2[20];
    	char directory[100];
     
    	int index_temp= 0;
    	int num_protocole= 0;
    	int mac_found= 0;
    	int host_found = 0;
    	int i = 0;
    	int size_tab=100;
    	int multiple_ip = 0;
     
     
    	struct info_host{
     
    		char mac_address[20];
    		char ip_address[20];		
     
    	};
     
    	struct info_host connected_host[size_tab];
     
     
     
    	printf("répertoire courant : %s / nb argument ; %d", argv[2],argc);
     
    	if(argc<=0){
     
    		exit(EXIT_FAILURE);
     
    	}

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    C'est lequel printf() ? indique la ligne clairement, on est pas devin!!!!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  5. #5
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("répertoire courant : %s / nb argument ; %d", argv[2],argc);
    est ce que vous avez donné un argument au binaire ?

    Si c'est pa le cas c'est là votre problème ??????

    PS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(argc<=0){
     
    		exit(EXIT_FAILURE);
     
    	}
    Ce code n'a aucun sense !!!! argc <=0, c'est à dire qu'il n y a aucun argume donné (mais le non du binaire est un argument a compté)
    Donc, il faut maitre argc<=1 ==> aucun argument n'est donné !!!
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    Ce code n'a aucun sense !!!! argc <=0, c'est à dire qu'il n y a aucun argume donné (mais le non du binaire est un argument a compté)
    Donc, il faut maitre argc<=1 ==> aucun argument n'est donné !!!
    Non!
    If the value of argc is greater than zero, the string pointed to by argv[0]
    represents the program name; argv[0][0] shall be the null character if the
    program name is not available from the host environment. If the value of argc is
    greater than one, the strings pointed to by argv[1] through argv[argc-1]
    represent the program parameters.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Alors pour le printf() en question, il s'agit de celui que j'ai mis en commentaire dans le main juste avant les déclarations de variables.

    Ensuite pour le argv[2], j'ai essayer en le retirant... aucun changement.

    Pour le argc<=0 que cela soit <=0 ou <=1 le résultat sera le même, mais je suis d'accord que je devrais mettre <=1.

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Pitié poste un code qui compile sinon on perd tous notre temps, 400 lignes c'est pas la mer à boire et ça sera régler rapidement!
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Non!
    mais si, si on test avec argc<=0, c'est a dire qu'on cherche a avoir une chaine de caractère passé qui est vide, qui est impossible, puisque il faut au moins avoir le nom du programme comme argv[0] (ou argv[argc-1])....

    => donc ça pas de sens.
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  10. #10
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Ben je peux pas trop non plus, c'est un code pour mon stage lol.

    Donc à priori, à part l'histoire des printf et des argc/argv, il n'y a rien de bizare??

    Bon ben va falloir que je me démerde pour trouver la raison du bug alors.

    Merci pour l'aide.

  11. #11
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par cmoibal Voir le message
    mais si, si on test avec argc<=0, c'est a dire qu'on cherche a avoir une chaine de caractère passé qui est vide, qui est impossible, puisque il faut au moins avoir le nom du programme comme argv[0] (ou argv[argc-1])....

    => donc ça pas de sens.
    Autant pour moi, je croyais que tu disais qu'il y avait forcément le nom du programme dans argv[0]. Mea culpa.
    Cordialement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  12. #12
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    Citation Envoyé par danathane Voir le message
    Ben je peux pas trop non plus, c'est un code pour mon stage lol.

    Donc à priori, à part l'histoire des printf et des argc/argv, il n'y a rien de bizare??

    Bon ben va falloir que je me démerde pour trouver la raison du bug alors.

    Merci pour l'aide.
    bon, si vraiment tu peut pas poster le code, utilises alors gdb, il te donneras l'emplacement exacte du crache !!!!
    (C'est un debugueur)

    Bon chance !
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  13. #13
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    je crois que je vais faire ca, parce que c'est un vrai mystère... le pire c'est que mon code fonctionnait très bien et que là d'un seul coup, plus rien... :

  14. #14
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    pour la nième fois, répétons :

    Pour débugger avec des printf, mettre des fprintf ( stderr, ...) qui est synchrone, et non des printf, qui sont bufferisés....

    On sait à coup sûr où ça plante....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #15
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Janvier 2007
    Messages : 273
    Points : 83
    Points
    83
    Par défaut
    Bonjour tout le monde!!
    Grâce à la mise ne pratique de vos conseil, j'ai finalement trouvé pourquoi mon programme me faisait des segmentation fault :

    Le problème est un mixe de manque de rigeur dans le code et de la faute à pas de chance.
    Je m'explique, dans mon programme, je fais en sorte de zapper les trames ARP lors de la rechercher des adresses mac et ip de mes stations. Le problème est que je ne fait pas ce test sur la première trame que je considère comme étant toujours correct. La faute a pas de chance, dans la capture que j'utilisais au moment du bug, ben.. la première trame est une trame ARP qui me met le bordel dans le reste du programme...

    Solution : vérifier que la trame 1 n'est pas une ARP...

    Allé merci encore et bonne journée.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 20/09/2012, 11h17
  2. Réponses: 2
    Dernier message: 08/04/2007, 17h23
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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