Segment default inconnue

Résolu/Fermé
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 3 juin 2014 à 15:25
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 - 9 juin 2014 à 09:35
Bonjour,
Pour des raisons de tests j'ai écrit se bout de code qui me permet de parcourir toute l'arborescence de mes répertoires, sauf qu'au bout d'une centaine de seconde apparais the segment défaut, peut-être que je suis aveugle mais je ne vois pas ou et le problème alors pour être sûr même-ci cela n'est pas la bonne démarche à faire, j'ai re-compilé ma source pour du BSD et là il me semble fonctionné même "gdb" & "valgrind" me cause que tout vas bien , j'ai dû louper un truc où c'est ma machine qui me joue des tour ?
Merci d'avance aux experts

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>

/**
* Fonction Liste les répertoires,sous répertoire && Affiche le contenu
**/
void f_Lister(char *nDir){
	
	DIR *pRep = NULL;
	struct stat st_Stat;
	struct dirent *pDir = NULL;
	
	if( (pRep = opendir(nDir))== NULL){
		perror("Impossible d'ouvrir le repertoire\n");
		return;
	}
	
	chdir(nDir);	
	while( (pDir = readdir(pRep))!= NULL){
		
		/*	pour les repertoire caché */
		if((strcmp(pDir->d_name,".")==0)||(strcmp(pDir->d_name,"..")==0))
			continue;
		
		/*	Acquisition des informations	*/
		lstat(pDir->d_name,&st_Stat);
		if(S_ISDIR(st_Stat.st_mode)){
			printf("Repertoire[%s]\n",pDir->d_name);
			f_Lister(pDir->d_name);
		}
		else
			printf("\t|_-> %s\n",pDir->d_name);
	}
	chdir("..");
	closedir(pRep);
}

/**
* Fonction principale
**/
int main(void){

	/*	Appel de la fonction F_Lister */
	f_Lister("/");
	return (EXIT_SUCCESS);
}

3 réponses

sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
4 juin 2014 à 09:27
Bonjour , personne à une petite idée ?
à bientôt
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
4 juin 2014 à 11:16
Salut,

Code testé OK

CC= gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
OS= Red Hat Centos 6 64bits


Dand GDB, tu as acces à la backtrace au moment du segfault ?

0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
5 juin 2014 à 09:58
Bonjour,
Merci de m'avoir répondu,
alors j'ai fait toute les manip de gdb même
gcc -g parcourd.c -Wall -o Lister 
rien à faire, cette fois-ci il plante directement au début de l'excution du programme "main" alors je n'ai pas cherché bien longtemps j'ai désassemblé et suivi son épate ligne par ligne résultat j'obtiens ceci et il me semble qu'il ne trouve pas un truc ou une instruction dans "getdents.c" en gros une des fonction de l'en-tête dirent pour les dossier bref puis il fait un sauf très bizarre pour le "main" ? alors franchement je suis largé sois j'ai fait une connerie dans mon code ou sur ma machine à vouloir expérimenter des choses pas très nettes ou peut être ma lib posix à pris un sacré coup
file="../sysdeps/unix/sysv/linux/getdents.c"line="105"/>
07ffff7ad6311 <__getdents+33>: mov %rax,%r13
07ffff7ad6361 <__getdents+113>: mov 0x2fcab8(%rip),%rdx #0x7ffff7dd2e20
07ffff7ad6368 <__getdents+120>: neg %eax 
07ffff7ad636a <__getdents+122>: or $0xffffffffffffffff,%r13
07ffff7ad636e <__getdents+126>: mov %eax,%fs:(%rdx)
07ffff7ad6371 <__getdents+129>: jmp $0x400982, %edi

à bientôt
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
5 juin 2014 à 10:03
désolé j'avais pas répondu à ta question, "gdb" me montre la ligne du main, puis j'ai utiliser nemiver pour voir ce qui ce passe ben résultat les infos ci-dessus,
perso je comprend plus rien.
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 2
5 juin 2014 à 10:11
Salut,

Ok, Je dois avouer que je n'ai pas trop d'idées (je n'ai jamais rencontré le pb...)
Cela dit, si tu fais les manips suivantes tu vois quelque chose d'anormale ?
- Modification du répertoire à parser en mettant une arbo plus petite (ex ton /home)
- ldd sur le binaire
- Compilation simple et sans le mode debug: gcc parcourd.c -o Lister
- Lancement de ton binaire avec strace (Avec rep plus petit que /) : strace ./Lister

"ou sur ma machine à vouloir expérimenter des choses pas très nettes"
Tu peux developper ? tu as trop joué les apprentis sorciers ?

0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
Modifié par sambia39 le 5/06/2014 à 10:46
Toutes les manips ont échoué, moi perso j'abandonne franchement là j'ai eu ma dose je pense que je vais delete Gcc et le réinstaller proprement à la mano.
En ce qui concerne Les Apprentis sorcier un peut des projet personnel
0
sambia39 Messages postés 610 Date d'inscription vendredi 31 juillet 2009 Statut Membre Dernière intervention 9 février 2023 49
9 juin 2014 à 09:35
Bonjour
Problème résolu, enfin j'ai fait radicale, j'ai désinstaller Gcc et Compagnie puis j'ai réinstaller le tout et tous re-fonctionne normalement.
à bientôt
0