OVH Cloud OVH Cloud

C & Mysql : segment fault (core dumped)

8 réponses
Avatar
dibzou
Bonjour,

Lorsque je compile mon programme, il n'y a pas de problème, aucune
erreur détectée... par contre quand je lance mon programme, j'ai bien
le résultat de ma requête qui s'affiche mais avec à la fin un 'segment
fault (core dumped)'.
J'ai lu dans plusieurs posts que c'est parce que le programme accède à
une partie de la mémoire qui ne lui est pas autorisé... ok mais que
puis -je faire pour palier à ce problème???

Je teste en fait un programme en C qui puisse se connecter à une base
MySQL.
J'ai récupéré ce code source comme exemple:
http://www.linuxfocus.org/Francais/September2003/mysql_test.c

J'ai modifié juste les paramètres de connexion et tout le reste du
code ne change pas.

Voici le résultat:

[dibzou@localhost dibzou]$ gcc -Wall mysql_test.c -o test1 -L/usr/lib
-lz
-L/usr/lib/mysql -lmysqlclient
[dibzou@localhost dibzou]$./test1
Connexion etablie...
Requete : select * from carnet
Resultat de la requete :
toto toto@toto.com
titi titi@titi.com
Segmentation fault (core dumped)
[dibzou@localhost dibzou]$

Si vous pouviez m'aider, ca serait gentil pour que j'avance sous
Linux...
Merci.

DibZou.

8 réponses

Avatar
Thierry Boudet
On 2005-04-13, dibzou wrote:

Lorsque je compile mon programme, il n'y a pas de problème, aucune


gcc -Wall ?

le résultat de ma requête qui s'affiche mais avec à la fin un 'segment
fault (core dumped)'.


man gdb
man strace

Si vous pouviez m'aider, ca serait gentil pour que j'avance sous
Linux...


crystalball broken.

--
_/°< coin

Avatar
yves
Je teste en fait un programme en C qui puisse se connecter à une base
MySQL.
J'ai récupéré ce code source comme exemple:
http://www.linuxfocus.org/Francais/September2003/mysql_test.c


Déjà le programme se termine par
exit(EXIT_SUCCESS);
mais nulle part tu définis EXIT_SUCCESS ;). Commence déjà par mettre un
exit(0); ou un #DEFINE EXIT_SUCESS 0 au début du fichier, mais passe un
paramètre correct à exit ;)


J'ai modifié juste les paramètres de connexion et tout le reste du
code ne change pas.

Voici le résultat:

[ dibzou]$ gcc -Wall mysql_test.c -o test1 -L/usr/lib
-lz
-L/usr/lib/mysql -lmysqlclient
[ dibzou]$./test1
Connexion etablie...
Requete : select * from carnet
Resultat de la requete :
toto
titi
Segmentation fault (core dumped)


et avec exit(0); c'est pas mieux ?

Merci.


De rien, mais dis nous quand même si c'était ça

Yves

--
http://wiki.rougy.net -- Wiki Unix/Linux

Avatar
Nicolas George
yves wrote in message <425d5be7$0$14063$:
Déjà le programme se termine par
exit(EXIT_SUCCESS);
mais nulle part tu définis EXIT_SUCCESS ;).


Dans tout environnement C qui se respecte, EXIT_SUCCESS est défini par
stdlib.h.

et avec exit(0); c'est pas mieux ?


De toutes façons, si EXIT_SUCCESS n'était pas défini, le programme ne
compilerait pas, point barre. En aucun cas ça ne peut causer une erreur de
segmentation.

Avatar
Khanh-Dang
Je teste en fait un programme en C qui puisse se connecter à une base
MySQL.
J'ai récupéré ce code source comme exemple:
http://www.linuxfocus.org/Francais/September2003/mysql_test.c


Déjà le programme se termine par
exit(EXIT_SUCCESS);
mais nulle part tu définis EXIT_SUCCESS


Le fichier mysql_test.c inclut le fichier stdlib.h. Et comme tout
stdlib.h standard, j'ai :

~ $ grep EXIT_SUCCESS /usr/include/stdlib.h
#define EXIT_SUCCESS 0 /* Successful exit status. */


Avatar
Khanh-Dang
Lorsque je compile mon programme, il n'y a pas de problème, aucune
erreur détectée... par contre quand je lance mon programme, j'ai bien
le résultat de ma requête qui s'affiche mais avec à la fin un 'segment
fault (core dumped)'.


Il te suffit de débugguer ton programme avec un débuggueur. Tu disposes
très certainement sur ton système de gdb.

Tu trouveras plus d'informations sur l'utilisation de gdb sur le web.

Avatar
Eric Stern
dibzou disait:

Bonjour,

Lorsque je compile mon programme, il n'y a pas de problème, aucune
erreur détectée... par contre quand je lance mon programme, j'ai bien
le résultat de ma requête qui s'affiche mais avec à la fin un 'segment
fault (core dumped)'.


je ne connais pas la bibiotheque sql utilisé mais il y a un truc qui me
choque.

char *query;
et
t=mysql_real_query(mysql, query, (unsigned int) strlen(query));

"query" ne doit pas etre initialisé ?

Avatar
dibzou
yves wrote in message news:<425d5be7$0$14063$...
Je teste en fait un programme en C qui puisse se connecter à une base
MySQL.
J'ai récupéré ce code source comme exemple:
http://www.linuxfocus.org/Francais/September2003/mysql_test.c


Déjà le programme se termine par
exit(EXIT_SUCCESS);
mais nulle part tu définis EXIT_SUCCESS ;). Commence déjà par mettre un
exit(0); ou un #DEFINE EXIT_SUCESS 0 au début du fichier, mais passe un
paramètre correct à exit ;)


J'ai modifié juste les paramètres de connexion et tout le reste du
code ne change pas.

Voici le résultat:

[ dibzou]$ gcc -Wall mysql_test.c -o test1 -L/usr/lib
-lz
-L/usr/lib/mysql -lmysqlclient
[ dibzou]$./test1
Connexion etablie...
Requete : select * from carnet
Resultat de la requete :
toto
titi
Segmentation fault (core dumped)


et avec exit(0); c'est pas mieux ?

Merci.


De rien, mais dis nous quand même si c'était ça

Yves


Non j'ai toujours le même message d'erreur :(


Avatar
Eric D.
Salut,


dibzou wrote:

J'ai lu dans plusieurs posts que c'est parce que le programme accède à
une partie de la mémoire qui ne lui est pas autorisé... ok mais que
puis -je faire pour palier à ce problème???


int main(){
<...>
char *query;
<...>
sprintf(query,"select * from %sn", MY_TABLE_NAME);

La variable query n'est pas allouée c'est un simple pointeur non initialisé
et donc le sprintf écrase une zone de mémoire ....

essaies :

int main(){
<...>
char query [256] ;
<...>
sprintf(query,"select * from %sn", MY_TABLE_NAME)

ou :
int main(){
<...>
char *query;
<...>
query = malloc(256) ;
sprintf(query,"select * from %sn", MY_TABLE_NAME);

Ca devrait marcher mieux ....
--
Eric