Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2553 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur de segmentation

n°1264417
sixtiesman
Posté le 12-12-2005 à 13:15:39  profilanswer
 

bonjour...
 
avant tout soyez indulgeant car je suis débutant en C  :)  
 
J'ai un soucis lorsque je lance mon programme sous linux :  j'obtiens le message "erreur de segmentation" lors de l'execution.
 
A partir de là, y'a-t-il un moyen qui permet de déterminer la ligne qui pose problème ?  
 
Merci d'avance  :hello:

mood
Publicité
Posté le 12-12-2005 à 13:15:39  profilanswer
 

n°1264419
theshockwa​ve
I work at a firm named Koslow
Posté le 12-12-2005 à 13:17:54  profilanswer
 

oui : utiliser un debugger (gdb est ton ami)

n°1264420
0x90
Posté le 12-12-2005 à 13:19:31  profilanswer
 

oui : étudier soigneusement ton code, et en particulier partout ou ca joue avec des pointeurs et des tableaux. (Ce qui implique de bien maitriser la notion de pointeurs )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1264432
sixtiesman
Posté le 12-12-2005 à 13:34:00  profilanswer
 

bonjour theshockwave et 0x90  :hello:  
 
J'ai cherché de la doc. sur le net à propos de gdb, et je suis arrivé à celà : (j'essaie de débugger le programme ex10b)
 

Citation :

[guillaume@localhost ex10]$ gdb ex10b
GNU gdb 6.3-5mdk (Mandriva Linux release 2006.0)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i586-mandriva-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1".
 
(gdb) run
Starting program: /mnt/travaux/ipl/c/ex/ex10/ex10b
Reading symbols from shared object read from target memory...done.
Loaded system supplied DSO at 0xffffe000
 
Program received signal SIGSEGV, Segmentation fault.
0xb7e8b4c0 in strcpy () from /lib/tls/libc.so.6
(gdb) where
#0  0xb7e8b4c0 in strcpy () from /lib/tls/libc.so.6
#1  0x0804892a in main ()

(gdb)  


 
n'y-a-t-il pas moyen de mettre un numéro de ligne là-dessus ?
 

Citation :

(Ce qui implique de bien maitriser la notion de pointeurs )


c'est bien le problème  ;) lol

n°1264440
0x90
Posté le 12-12-2005 à 13:37:49  profilanswer
 

Le problème avec les erreurs de segmentation, c'est que ce n'est pas forcément une ligne précise qui provoque l'erreur.
L'erreur survient si on essaye d'acceder avec un pointeur a un bout de mémoire auquel on a pas le droit.  
Maintenant imagine qu'a un moment tu te serve d'un pointeur dans ton programme, et tu te plante tu lui donne une mauvaise valeur.
Si t'as de la chance, ca pointe vers un endroit invalide -> Segfault.
Si t'as pas de change, ca pointe pas ou tu veut mais vers un endroit valide -> Le programme continue, et plantera plus tard, parfois, des fois a moitié des fois pas du tout, t'aura ptêtre des valeurs bizarres mais pas de segfault, etc...
En gros, un segfault n'arrive pas forcément a l'endroit du code d'ou l'erreur est partie, difficile donc de dire d'ou vient l'erreur en terme de "ligne de code"...


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1264459
Elmoricq
Modérateur
Posté le 12-12-2005 à 13:48:02  profilanswer
 

Erreur sur un strcpy()... je veux voir la définition des variables source et cible de la fonction, parce que je subodore un dépassement de capacité [:klem3i1]
 
Tu peux nous poster ça, sixtiesman ?

n°1264462
sixtiesman
Posté le 12-12-2005 à 13:49:27  profilanswer
 

Citation :

L'erreur survient si on essaye d'acceder avec un pointeur a un bout de mémoire auquel on a pas le droit.


mmmm... le fameux "address space" ?
 

Citation :

En gros, un segfault n'arrive pas forcément a l'endroit du code d'ou l'erreur est partie, difficile donc de dire d'ou vient l'erreur en terme de "ligne de code"...


ouille ouille ouille  :lol:  
Si j'ai bien compris, mon seul point de départ, c'est de savoir que c'est un des "strcpy" qui pose problème  :)

n°1264465
Elmoricq
Modérateur
Posté le 12-12-2005 à 13:51:27  profilanswer
 

sixtiesman a écrit :


Si j'ai bien compris, mon seul point de départ, c'est de savoir que c'est un des "strcpy" qui pose problème  :)


 
Donne le core généré à gdb, il te donnera plus d'information.

n°1264469
sixtiesman
Posté le 12-12-2005 à 13:54:33  profilanswer
 

Elmoricq a écrit :

Erreur sur un strcpy()... je veux voir la définition des variables source et cible de la fonction, parce que je subodore un dépassement de capacité [:klem3i1]
 
Tu peux nous poster ça, sixtiesman ?


d'accord, mais ne vous moquez pas alors  :lol:  
 

Citation :

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
 


 

Citation :

Donne le core généré à gdb, il te donnera plus d'information.


Il se trouve où ce fameux core ? A mon école il se trouve dans le repertoire courant oui mais pas ici dans ma distrib. linux. merci


Message édité par sixtiesman le 12-12-2005 à 14:29:32
n°1264472
Elmoricq
Modérateur
Posté le 12-12-2005 à 13:57:01  profilanswer
 

My God.  [:psychokwak]  
 
 
Bon, sinon je peux te dire que l'erreur vient de n'importe quel strcpy() avec NULL en paramètre.
 
Je n'ai pas regardé le reste, je tiens à ma santé mentale. Mais comme ça en quelques secondes, je peux te dire qu'il y a des tas d'autres points qui posent problème :o
 
 
EDIT : code pour isoler le problème :

#include <stdio.h>
#include <string.h>
 
int main(void)
{
    char test[50];
     
    /* segmentation fault */
    strcpy(test, NULL);
     
    return 0;
}


 
 
EDIT 2 : explication rapide : strcpy() part de l'adresse que tu lui donnes en second paramètre, et copie tous les char qu'il trouve vers l'adresse donnée en premier paramètre, jusqu'à ce qu'il trouve '\0' (pas le caractère "0", mais un char entièrement à 0, exemple : 0x00).
Donc là tu lui demandes de copier des données à partir de NULL qui, par définition, représente le néant.


Message édité par Elmoricq le 12-12-2005 à 14:03:01
mood
Publicité
Posté le 12-12-2005 à 13:57:01  profilanswer
 

n°1264491
sixtiesman
Posté le 12-12-2005 à 14:04:45  profilanswer
 

oui je comprends que j'ai fait une connerie là... Je ne t'en veux pas de t'épargner de ceci lol
 
je vais continuer à travailler seul mnt merci
 
juste un petit mot d'explication : il se trouve où le "core" ?

n°1264494
Elmoricq
Modérateur
Posté le 12-12-2005 à 14:05:32  profilanswer
 

A l'endroit à partir duquel tu as exécuté le binaire, normalement.
 
Sinon tente le bon vieux "find / -name core" [:klem3i1]


Message édité par Elmoricq le 12-12-2005 à 14:05:55
n°1264508
sixtiesman
Posté le 12-12-2005 à 14:17:49  profilanswer
 

pas de fichier core dans le repertoire courant non
 

Citation :

[guillaume@localhost ex10]$ ls
animalerie.data*  ç*                  ex10a*    ex10a.c~*  ex10b.c*   fournisseur.data*  output.data*  
ex10a.c*  ex10b*     ex10b.c~*


 
voici les seuls core qu'il a trouvé.
 

Citation :

/dev/core
/lib/modules/2.6.12-12mdk/kernel/drivers/infiniband/core
/lib/modules/2.6.12-12mdk/kernel/drivers/usb/core
/lib/modules/2.6.12-12mdk/kernel/net/core
/lib/modules/2.6.12-12mdk/kernel/sound/core


 
Celà n'est pas bien grave,
 
merci theshockwave, 0x90 et surtout Elmoricq pour ton aide,
 
vous êtes cools  :hello:


Message édité par sixtiesman le 12-12-2005 à 14:25:47
n°1265156
matafan
Posté le 13-12-2005 à 05:57:22  profilanswer
 

ulimit -c unlimited pour avoir un core.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur de segmentation

 

Sujets relatifs
erreur de segmentation sur stringErreur Segmentation
Erreur de segmentationerreur de segmentation
erreur de segmentation pourtant simpleproblème d'erreur de segmentation
Erreur de segmentationErreur de segmentation - appel strsep
Erreur de segmentation :/erreur de segmentation
Plus de sujets relatifs à : Erreur de segmentation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR