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

Linux Discussion :

[XLib] Réparer le programme xdames


Sujet :

Linux

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 099
    Points : 15 573
    Points
    15 573
    Billets dans le blog
    9
    Par défaut [XLib] Réparer le programme xdames
    Bonjour tout le monde !

    J'essaie de réparer ce programme : https://sourceforge.net/projects/xda...es/xdames-0.4/

    La fenêtre s'ouvre et se referme aussitôt avec le message suivant dans le terminal : Erreur de segmentation (core dumped)

    Apparemment, le programme se plante dès qu'il rencontre une instruction du genre XSetForeground(XDisp,XGCBack,ColorTable[couleur]);.


    J'ai ajouté une ligne dans le code pour vérifier que la variable XGCBack était correctement initialisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      XGCBack = XCreateGC(XDisp, win, 0, &gcvback);
      if (XGCBack == NULL)
      {
        printf("erreur XCreateGC\n");
      }
    Mon message ne s'affiche pas, donc il semblerait que le problème soit ailleurs mais je ne sais pas où.

    Soit dit en passant, je vois dans le Makefile l'option -ggdb. J'imagine que ça permet d'utiliser le débogueur, mais je ne sais pas comment on fait.

    Si quelqu'un qui connaît bien XLib voulait jeter un œil...

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 099
    Points : 15 573
    Points
    15 573
    Billets dans le blog
    9
    Par défaut
    Ah zut j'ai encore posté dans le "mauvais" forum. Quelqu'un pourrait-il déplacer la discussion dans le forum C SVP ?

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 975
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 975
    Points : 221 711
    Points
    221 711
    Billets dans le blog
    131
    Par défaut
    Bonjour,

    Pour le forum, je ne suis pas certain, votre problème semble être Linux spécifique (notamment, de par l'utilisation de gdb et de la bibliothèque X11).

    Donc, il va falloir utiliser GDB (et apprendre à l'utiliser ). J'ai écris un article sur le sujet, mais il est possible qu'il soit un peu trop vieux.
    Bref, il va falloir lancer le programme dans gdb. Le plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gdb ./monProgramme
    run
    Le programme va s'arrêter au crash, et il faudra faire :
    pour avoir la liste d'appels (les fonctions qui ont été appelée et menant à ce point dans le programme) ; up pour remonter dans la liste d'appels (car il est très probable que vous soyez dans une fonction d'une bibliothèque) ; print myVar pour afficher la valeur de myVar.

    Amusez vous bien

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 099
    Points : 15 573
    Points
    15 573
    Billets dans le blog
    9
    Par défaut
    Merci pour votre réponse, et pour le mode d'emploi de GDB.

    Le débogueur m'indique l'endroit que j'avais déjà repéré :

    Code C : 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
    void affiche_damier()
    {
      char S[10];
      int i, j;
     
      printf ("This is line %d of file \"%s\".\n", __LINE__, __FILE__);
     
      for (i = 0; i < 10; i++)
      {
        for (j = 0; j < 10; j++)
        {
          printf("ColorTable[255]=%d\n", ColorTable[255]);
          printf("ColorTable[0]=%d\n", ColorTable[0]);
          printf("XDisp=%p\n", XDisp);
          printf("XGCBack=%p\n", XGCBack);
     
          if ((i + j) & 1)
          {
            XSetForeground(XDisp, XGCBack, ColorTable[255]);

    Code X : 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
    [roland@localhost xdames]$ gdb xdames
    GNU gdb (GDB) 10.1-5.1.mga8 (Mageia release 8)
    ...
    Reading symbols from xdames...
    (gdb) run
    Starting program: /home/roland/Documents/pascal/echecs/dames/xdames/xdames 
    Missing separate debuginfos, use: debuginfo-install glibc-2.32-30.mga8.x86_64
    ...
    This is line 149 of file "xdames-disp.c".
    ColorTable[255]=16777215
    ColorTable[0]=0
    XDisp=(nil)
    XGCBack=0x41b860
    
    Program received signal SIGSEGV, Segmentation fault.
    0x00007ffff7d60c6a in XSetForeground () from /lib64/libX11.so.6
    Missing separate debuginfos, use: debuginfo-install lib64bsd0-0.10.0-2.mga8.x86_64 lib64x11_6-1.7.0-1.3.mga8.x86_64 lib64xau6-1.0.9-2.mga8.x86_64 lib64xcb1-1.14-1.mga8.x86_64 lib64xdmcp6-1.1.3-2.mga8.x86_64
    (gdb) finish
    Run till exit from #0  0x00007ffff7d60c6a in XSetForeground () from /lib64/libX11.so.6
    
    Program terminated with signal SIGSEGV, Segmentation fault.
    The program no longer exists.
    (gdb) quit
    [roland@localhost xdames]$

    Donc il semblerait que le coupable soit XDisp, qui ne devrait pas valoir nil à ce moment-là.

    Mais au moment où la variable est initialisée,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int init_fenetre()
    {
      int i, r, v, b;
      printf ("This is line %d of file \"%s\".\n", __LINE__, __FILE__);
     
      if ((XDisp = XOpenDisplay(NULL)) == NULL) return True;
     
      printf ("This is line %d of file \"%s\".\n", __LINE__, __FILE__);
    tout semble se passer correctement. Donc là je ne comprends plus rien.

    Bon, je continue à chercher...

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 099
    Points : 15 573
    Points
    15 573
    Billets dans le blog
    9
    Par défaut
    Ça y est, j'ai trouvé, en contrôlant la valeur de Disp ligne après ligne.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    This is line 1198 of file "xdames.c". [XDisp = 0x23842a0]
    This is line 1202 of file "xdames.c". [XDisp = (nil)]

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      printf ("This is line %d of file \"%s\". [XDisp = %p]\n", __LINE__, __FILE__, XDisp); // 1198
      efface_tab_mvt(mvt_b, ptr_mvt_b);
      efface_tab_mvt(mvt_n, ptr_mvt_n);
      efface_tab_mvt(mvt_tmp, ptr_mvt_tmp);
      printf ("This is line %d of file \"%s\". [XDisp = %p]\n", __LINE__, __FILE__, XDisp); // 1202

    Et donc l'erreur était là :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void efface_tab_mvt(LISTE_MVT mvt_dummy[256], int ptr_mvt_dummy[1])
    {
      int i;
     
      //~ for (i = 256; i >= 0; i--) // <---
      for (i = 255; i >= 0; i--)
      {
        mvt_dummy[i].dep_x = 0;

    C'est cette erreur d'index qui faisait que la valeur de Disp devenait nil...

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 099
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 099
    Points : 15 573
    Points
    15 573
    Billets dans le blog
    9
    Par défaut
    Si ça intéresse quelqu'un, la version corrigée est disponible là : https://gitlab.com/rchastain/xdames

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

Discussions similaires

  1. Comment Réparer lancement des programmes
    Par ohenri dans le forum Windows 7
    Réponses: 4
    Dernier message: 20/01/2011, 14h45
  2. programmation graphique : xlib ,xt.
    Par miomikio dans le forum Qt
    Réponses: 4
    Dernier message: 10/03/2008, 22h08
  3. [XML] recherche programme permettant de réparer 1 XML
    Par frechy dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 03/04/2006, 17h35
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 15h50
  5. [Kylix] icone associée à un programme
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 10h43

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