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

GTK+ avec C & C++ Discussion :

Segfault à l'exécution


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut Segfault à l'exécution
    Bonjour.

    C'est dans un état de stress intense que je vous contacte.

    J'ai commencé à développer mon projet GTK sur les machines de mon école. (Debian et KDE). J'ai ensuite exporté tout ca sur mon pc sans aucun problème. (Ubuntu Feisty Fawn Gnome)

    Depuis j'ai retraillé énormément sur le projet sur mon pc. Je le réexporte vers une machine de l'école et là : segfault!

    Ca bloque apparemment à un appel de fonction que je fais dans une fonction. Voici cette dernière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void BoutonNouveau(GtkWidget* pSaisie, gpointer data)
    {
    	printf("Entree dans bouton nouveau\n");
    	ParamBoutonNouveau* paramBoutonNouveau;
     
    	GtkWidget* pDialogue;
    	pDialogue = gtk_dialog_new();
     
    	paramBoutonNouveau = (ParamBoutonNouveau*)data;
    	printf("Donnees recuperees\n");
     
    	if ( DebutTestPossible == FALSE )
    	{
    		printf("Entree dans le if\n");
    		BoiteMessageImpossibleQuitter(pDialogue);
    	}
    	else
    	{
    		printf("J'en ai marre!!!!!\n");
    EnregistrerProfil(GTK_WIDGET(paramBoutonNouveau->Fenetre),
    				GTK_WIDGET(paramBoutonNouveau->EBox),
    				GTK_WIDGET(paramBoutonNouveau->Label1),
    				GTK_WIDGET(paramBoutonNouveau->Label2),
    				GTK_WIDGET(paramBoutonNouveau->VBox));
    	}
    }
    Dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int main(int argc,char **argv)
    {
    ...
    	ParamBoutonNouveau* paramBoutonNouveau;
    ...
    	paramBoutonNouveau = (ParamBoutonNouveau*)malloc(sizeof(ParamBoutonNouveau));
    	paramBoutonNouveau->Fenetre = pFenetre;
    	paramBoutonNouveau->EBox = pEBox;
    	paramBoutonNouveau->VBox = pVBox;
    ...
    gtk_signal_connect(GTK_OBJECT(pBoutonNouveau), "clicked", G_CALLBACK(BoutonNouveau), paramBoutonNouveau);
    ...
    	free(paramBoutonNouveau);
    ...	
        return 0;
    }
    La compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    make
    gcc `pkg-config --libs --cflags gtk+-2.0`  -o appli1 main.c traitementSaisie.c bouton.c traitementImage.c boiteMessage.c  -DDEBUG
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Entree dans bouton nouveau
    Donnees recuperees
    J'en ai marre!!!!!
    Segmentation fault
    Ca bloque donc à la fonction EnregistrerProfil. Celle-ci est définie dans une autre .c mais j'inclue bien le .h correspondant.

    Je n'y comprends absolument rien étant donné que tout fonctionne niquel sur mon pc.
    Si ce que j'ai mis ne suffit pas, n'hésitez pas à demander plus de source, je suis même pret à lacher le tar complet pourvu que mon projet se lance!

    PS : j'ai également essayé de déclarer la structure en statique, sans passer par des malloc, ca marche aussi sur mon pc et pas non plus sur les machines de l'école...

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Tu le fais quand le free (paramBoutonNouveau) ? après l'appel à gtk_main ? Sinon c'est normal que ça plante.
    Si c'est pas ça, je pense que le moment est venu de regarder comment utiliser valgrind ou gdb

  3. #3
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    J'ai bien fait le free avant de lancer la boucle évènementielle.

    J'ai jamais utilisé gdb mais il me dit des choses qui me paraissent pas sympa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    (gdb) run
    Starting program: /home/ima2i/tduchate/Desktop/Tuto_GTK/Appli1_modulaire/appli1
    Entree dans bouton nouveau
    Donnees recuperees
    Jen ai marre!!!!!
     
    Program received signal SIGSEGV, Segmentation fault.
    0xb7b0dcf3 in g_type_check_instance_cast () from /usr/lib/libgobject-2.0.so.0
    (gdb) list
    1       ../sysdeps/i386/elf/start.S: No such file or directory.
            in ../sysdeps/i386/elf/start.S
    (gdb) next
    Single stepping until exit from function g_type_check_instance_cast,
    which has no line number information.
     
    Program terminated with signal SIGSEGV, Segmentation fault.
    The program no longer exists.
    Ca te parle toi?

  4. #4
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Autant pour moi.

    Je faisais le free avant le gtk_main et pas apres...

    Désolé de vous avoir communiqué mon stress..

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Pour gdb, quand t'as fait crasher ton programme, si tu tapes backtrace il t'affiche la liste des appels de fonction ayant conduit au crash. Pour ton pb présent, valgrind aurait été capable de te raconter exactement ce qui allait pas à mon avis (ie "à tel endroit, tentative d'accéder à de la mémoire qui a été libérée à tel autre endroit")

  6. #6
    Membre confirmé Avatar de thibane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2007
    Messages : 143
    Par défaut
    Ok merci pour l'astuce.

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

Discussions similaires

  1. [ArchiveBuilder][JavaMail] exécution impossible...
    Par Gorthal dans le forum JBuilder
    Réponses: 7
    Dernier message: 10/01/2003, 09h12
  2. [TTHREAD] ne termine pas sont exécution
    Par Bbenj dans le forum Langage
    Réponses: 4
    Dernier message: 02/08/2002, 16h42
  3. Exécution indivisible (accès conccurent)
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 23/07/2002, 08h09
  4. Compression d'exécutables
    Par Atrebate62 dans le forum Windows
    Réponses: 3
    Dernier message: 21/07/2002, 16h39
  5. Réponses: 2
    Dernier message: 06/07/2002, 12h36

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