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 :

C, mysql.h et "Segmentation fault" :/


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut C, mysql.h et "Segmentation fault" :/
    Bonsoir,

    J'aurais une question concernant un petit souci que je rencontre depuis hier soir maintenant. Je développe
    une application en C sous Debian Etch. Elle se compose de deux modules que j'ai développé séparément :

    - Un premier qui vérifie le résultat d'une requête HTTP et qui autorise ou non la poursuite de l'exécution
    de l'applicatif

    - Un second qui se connecte à une base de données et fait son méli-mélo d'actions.

    Mon souci a commencé lorsque j'ai souhaité assembler ces deux modules. J'ai réussi à faire des librairies,
    à faire mes fichiers d'entête, à les intégrer à mon programme principal et à utiliser les fonctions. Aucune
    erreur ni avertissement ne s'affiche lors de la compilation de mon programme.

    Seulement voilà, lors de son exécution, j'obtiens un "Segmentation Fault". J'ai trouvé sur Internet comment
    faire pour débugger une application en C et j'ai trouvé l'outil gdb. J'ai réussi à sortir ces informations :

    ns1:/usr/src/# gdb poller
    GNU gdb 6.4.90-debian
    Copyright (C) 2006 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

    (gdb) r
    Starting program: /usr/src//poller
    Failed to read a valid object file image from memory.
    [Thread debugging using libthread_db enabled]
    [New Thread -1212082496 (LWP 11601)]
    Checking licence... This may take some seconds...
    Licence check : Ok.
    Initialisation du client MySQL...
    Initialisé.
    Définition de l'environnement du client MySQL...
    Définit.
    Connexion au serveur MySQL...

    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread -1212082496 (LWP 11601)]
    0xb7d0772d in free () from /lib/tls/i686/cmov/libc.so.6
    (gdb) bt
    #0 0xb7d0772d in free () from /lib/tls/i686/cmov/libc.so.6
    #1 0xb7e1adf1 in my_no_flags_free () from /usr/lib/libmysqlclient.so.15
    #2 0xb7e3ed8c in mysql_real_query () from /usr/lib/libmysqlclient.so.15
    #3 0xb7e413a8 in mysql_real_connect () from /usr/lib/libmysqlclient.so.15
    #4 0x08048fda in main () at poller.c:50
    (gdb) frame 0
    #0 0xb7d0772d in free () from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 1
    #1 0xb7e1adf1 in my_no_flags_free () from /usr/lib/libmysqlclient.so.15
    (gdb) frame 2
    #2 0xb7e3ed8c in mysql_real_query () from /usr/lib/libmysqlclient.so.15
    (gdb) frame 3
    #3 0xb7e413a8 in mysql_real_connect () from /usr/lib/libmysqlclient.so.15
    (gdb) frame 4
    #4 0x08048fda in main () at poller.c:50
    50 if (!mysql_real_connect(MySQL_Link, MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE, 0, NULL, 0)) {
    Pour information, je vous ai mis à disposition les fichiers sources :

    poller.c http://pastebin.deus-rulez.com/pastebin.php?show=10
    deb_licence.c http://pastebin.deus-rulez.com/pastebin.php?show=11

    Ainsi qu'un petit package global du projet (il n'y a pas grand chose) : http://www.deus-rulez.com/c_bugs.tar.gz

    Auriez vous une idée de solution ? J'ai cherché sur Internet et je n'ai trouvé aucune information.

    Merci par avance pour vos lumières,

    Havran

    PS : gcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Le pointeur MySQL_Link passé en paramètre à mysql_real_connect n'est pas initialisé.

    Pourquoi la ligne

    MySQL_Link = mysql_init(NULL);

    est en commentaire ?.
    Il peut y avoir d'autres problèmes, mais ça, c'est pas bon.

    http://doc.domainepublic.net/mysql/d...ysql_init.html

    Bonne continuation

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Merci pour me rappeler cet oubli.

    J'ai modifié la source, en effet j'avais oublié de décommenter ces lignes.
    Cependant, le problème persiste avec d'autres erreurs du même genre.

    Voici le nouveau poller.c : http://pastebin.deus-rulez.com/pastebin.php?show=12

    Et les nouvelles traces du gdb :

    ns1:/usr/src/# gdb poller
    GNU gdb 6.4.90-debian
    Copyright (C) 2006 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 "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

    (gdb) r
    Starting program: /usr/src//poller
    Failed to read a valid object file image from memory.
    [Thread debugging using libthread_db enabled]
    [New Thread -1212692800 (LWP 1667)]
    Checking licence... This may take some seconds...
    Licence check : Ok.
    Initialisation du client MySQL...

    Program received signal SIGSEGV, Segmentation fault.
    [Switching to Thread -1212692800 (LWP 1667)]
    0xb7c77eda in strcmp () from /lib/tls/i686/cmov/libc.so.6
    (gdb) bt
    #0 0xb7c77eda in strcmp () from /lib/tls/i686/cmov/libc.so.6
    #1 0xb7cea072 in __nss_database_lookup () from /lib/tls/i686/cmov/libc.so.6
    #2 0xb7ceb2eb in __nss_hostname_digits_dots ()
    from /lib/tls/i686/cmov/libc.so.6
    #3 0xb7cef95e in getservbyname_r () from /lib/tls/i686/cmov/libc.so.6
    #4 0xb7cef74e in getservbyname () from /lib/tls/i686/cmov/libc.so.6
    #5 0xb7d84752 in mysql_server_init () from /usr/lib/libmysqlclient.so.15
    #6 0xb7daa12e in mysql_init () from /usr/lib/libmysqlclient.so.15
    #7 0x0804904c in main () at poller.c:42
    (gdb) frame 0
    #0 0xb7c77eda in strcmp () from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 1
    #1 0xb7cea072 in __nss_database_lookup () from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 2
    #2 0xb7ceb2eb in __nss_hostname_digits_dots ()
    from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 3
    #3 0xb7cef95e in getservbyname_r () from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 4
    #4 0xb7cef74e in getservbyname () from /lib/tls/i686/cmov/libc.so.6
    (gdb) frame 5
    #5 0xb7d84752 in mysql_server_init () from /usr/lib/libmysqlclient.so.15
    (gdb) frame 6
    #6 0xb7daa12e in mysql_init () from /usr/lib/libmysqlclient.so.15
    (gdb) frame 7
    #7 0x0804904c in main () at poller.c:42
    42 MySQL_Link = mysql_init(NULL);
    Je ne vois toujours pas d'où peut provenir l'erreur car si je commente les lignes 32-39 qui correspondent à la première partie de l'applicatif, la seconde partie du code (ligne 41-80) fonctionnera normalement et vice versa.

    J'ai remis en ligne une seconde version des sources/binaires :
    http://www.deus-rulez.com/c_bugs_2.tar.gz

  4. #4
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je n'ai pas regardé le code, mais le diagnostic est clair :

    dans le strcmp à la ligne mentionnée il y a sans doute une des 2 chaines qui est NULL....

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Une erreur de la libc livrée en "stable" avec Debian Etch ?

    J'ai beaucoup de mal à y croire... Une autre idée peut être ?

  6. #6
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut


    j'ai pas dire une erreur de la libc..

    J'ai dit : "le strcmp a une des 2 chaines qui est a NULL"

    C'est dans TON code

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Etant donné que je reste "novice" en développement C, est il possible de me souffler un indice complémentaire pour que je puisse résoudre ce souci ?

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Vraissemblablement tu as des erreurs memoire (genre : mauvais free, dépassements..) avant mysql_init() qui font que mysql_init() plante. Revérifie ton checkLicence()

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Malheureusement, je n'ai aucune notion de free() (à chaque fois que je faisais quelque chose avec ça, j'avais des fautes de partout). Voici la source dudit code, auriez vous une idée des modifications à faire ? :/

    http://pastebin.deus-rulez.com/pastebin.php?show=16

  10. #10
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Alors, j'ai pas compté mais je pense que ton tableau "line" dans HTMLRequest() peut etre trop court pour le texte que tu y mets.
    Ensuite, je pense que ya un risque de depassement dans HTMLRead si les données à lire sont plus grandes que n + 1 (j'ai pas bien analysé l'algo, peux pas être sur)

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    Si c'était le cas, il n'y aurait pas un souci justement au niveau de la librairie que j'ai créé avec cette fonction au lieu de me sortir une erreur au niveau des fonctions MySQL ?

    Sachant que la fonction HTML Request je la teste indépendemment et elle fonctionne.

    Il ne manquerait pas plutot des "free()" ? Enfin je ne sais pas.

    Pour ce qui est du tableau line, il prend la taille du buffer lu + 1.

    Pour ce qui est du HTMLRead, je ne sais pas :/

  12. #12
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    D'apres mon experience en C sur des machines PC/Linux, les problemes memoire tels que les depassement de tableaux peuvent provoquer les comportement les plus etranges, faire planter un truc qui normalement marche (genre une fonction de la lib standard), ou ne rien faire de special. Mais dans ces cas ci, les trucs bizarres se manifestent APRES l'erreur (juste après ou un peu après, voir à la fin du programme).

    Un free manquant ne poserait pas de probleme, par contre un mauvais free oui

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 22
    Par défaut
    J'ai réussi à résoudre le problème en réécrivant complètement la partie HTTP Request.

    Merci à vous pour votre aide

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

Discussions similaires

  1. [API MySQL] Segmentation fault
    Par Bisûnûrs dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 16/07/2007, 17h27
  2. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  3. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  4. 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