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 :

Le programme s'est terminé subitement.


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut Le programme s'est terminé subitement.
    Salut,

    J'essaie de porter Antlr4 sur la plateforme GLib mais j'ai une erreur de type segfault (core dump)

    gdb me dit que c'est à cette ligne GString *buf = g_string_new(""); et que c'est sur un g_slice_alloc(). Mais ne voit pas du tout comment corriger ce problème.

    Votre aide me serrais très précieuse.


    Si vous souhaitez voire le code, ca se passe ici

    Si vous souhaitez compiler (37s) voici les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $] cd <WORKSPACE>
    $] mkdir antlr4-glib-build
    $] git clone https://github.com/gaulouis/antlr4-glib.git
    $] cd antlr4-glib
    $] export NOCONFIGURE=1
    $] ./autogen.sh
    $] cd ../antlr4-glib-build
    $] ../antlr4-glib/configure
    $] make
    $] export LD_LIBRARY_PATH=<WORKSPACE>/antlr4-glib-build/lib/antlr/.libs:<WORKSPACE>/antlr4-glib-build/lib/sql/.libs
    Enfin, pour exécuter le programme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $] <WORKSPACE>/antlr4-glib-build/src/org_antlr

  2. #2
    Membre confirmé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 329
    Points : 606
    Points
    606
    Par défaut
    Bonjour,
    J'ai appliqué tes instructions, et j'obtiens (sous MINT17) une sortie sur stdout de 1600 lignes qui comence par
    BASE_SERIALIZED_UUID=77, ADDED_PRECEDENCE_TRANSITIONS=78, ADDED_LEXER_ACTIONS=76
    uuid: 76
    grammar_type= 0; max_token_type: 73
    nstates=521 (p=12)
    G_MAXUINT16= 65535
    stype(6), (-1)
    stype(2), (0)
    stype(7), (0)
    ...
    et se termine par
    ...
    testing EOF at (484,73,[$])
    DFA after matchATN:
    CHECK implementation of g_hash_table from: antlr_parser_atn_simulator_compute_start_stateCHECK implementation of g_hash_table from: antlr_parser_atn_simulator_compute_start_stateCHECK implementation of g_hash_table from: antlr_parser_atn_simulator_compute_start_stateselect t.field as f from table as t
    /home/sam/local/src/org-antlr/lib/antlr/atn/atn.c near line 131 break point
    => je suis un étonné de voir un chemin absolu ne correspondant pas à ma machine.
    Sur stderr j'ai
    ** (process:10591): CRITICAL **: antlr_token_get_token_index: assertion 'ANTLR_IS_TOKEN (token)' failed
    GraceGTK: a plotting tool at https://sourceforge.net/projects/gracegtk

  3. #3
    Membre confirmé Avatar de Gaulouis
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2015
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 252
    Points : 476
    Points
    476
    Par défaut
    Merci pour ton intervention pvincent,

    je suis un étonné de voir un chemin absolu ne correspondant pas à ma machine.
    Ha oui. Désolé. Je suis en plein chantier... Avec l’énervement je n'ai pas fait assez attention. En réalité rien d'étonnant c'est codé en dur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #if PROG_NAME == 4
    int
    main (int argc, char *argv[])
    {
        const gchar *filename = "/home/sam/local/src/org-antlr/share/script/script.sql";
        GError *error = NULL;
        AntlrFileStream *file_stream = antlr_file_stream_new_from_filename_encoding(filename, NULL, &error);
    [...]
        g_print("select t.field as f from table as t \n");
        g_print("/home/sam/local/src/org-antlr/lib/antlr/atn/atn.c near line 131 break point \n");
     
        return 0;
    }
    #endif
    Je corrigerais const gchar *filename = argv[1]; ou const gchar *filename = PACKAGE_DATA_DIR "/script/script.sql";Même moi je m'étonne que le programme se soit exécuté en entier alors que filename n'est pas un nom de fichier existant.


    Quoi qu'il en soit, j'ai sortie Valgrind et j'ai plein de fuite de mémoire. Mon problème vient peut être de là. En tout cas c'est la piste que je vais suivre. Mais si vous avez d'autre piste je suis preneur.

    PS: Je passerai en résolut quand j'aurais trouvé pourquoi g_slice_alloc me segfault.

  4. #4
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    Bonjour, déjà dans antlr_atn_config_to_string_with_options, c'est normal que tu aies des fuites mémoires, vu que tu ne libères pas la GString.

    À la place de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return buf->str;// TODO dup ->str and free GString
    Fais un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return g_string_free(buf, FALSE);
    Ainsi tu renvoies le buffer de caractères vers lequel pointait la GString, pas besoin de le dupliquer. L'appelant devra le libérer avec g_free.

    Ensuite pour ton problème d'allocation, je suspecte un mélange d'appels à free et g_free. Vérifie avec quoi tu effectues tes libérations.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

Discussions similaires

  1. Réponses: 7
    Dernier message: 07/02/2014, 15h24
  2. Réponses: 3
    Dernier message: 29/08/2012, 11h02
  3. [Process] comment savoir si exec est termine
    Par v1nc3kr0 dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 29/06/2005, 16h54
  4. Comment savoir si un Shell est terminé ?
    Par Mr Capone dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 21/02/2005, 17h05
  5. [Image] détecter que le chargement est terminé
    Par Pascmar dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 19/07/2004, 19h12

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