Erreur de segmentation

Erreur de segmentation - C - Programmation

Marsh Posté le 12-12-2005 à 13:15:39    

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:

Reply

Marsh Posté le 12-12-2005 à 13:15:39   

Reply

Marsh Posté le 12-12-2005 à 13:17:54    

oui : utiliser un debugger (gdb est ton ami)

Reply

Marsh Posté le 12-12-2005 à 13:19:31    

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.
Reply

Marsh Posté le 12-12-2005 à 13:34:00    

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

Reply

Marsh Posté le 12-12-2005 à 13:37:49    

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.
Reply

Marsh Posté le 12-12-2005 à 13:48:02    

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 ?

Reply

Marsh Posté le 12-12-2005 à 13:49:27    

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  :)

Reply

Marsh Posté le 12-12-2005 à 13:51:27    

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.

Reply

Marsh Posté le 12-12-2005 à 13:54:33    

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
Reply

Marsh Posté le 12-12-2005 à 13:57:01    

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
Reply

Marsh Posté le 12-12-2005 à 13:57:01   

Reply

Marsh Posté le 12-12-2005 à 14:04:45    

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" ?

Reply

Marsh Posté le 12-12-2005 à 14:05:32    

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
Reply

Marsh Posté le 12-12-2005 à 14:17:49    

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
Reply

Marsh Posté le 13-12-2005 à 05:57:22    

ulimit -c unlimited pour avoir un core.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed