#1 Le 14/12/2024, à 19:21
- Antoine79
Erreurs de segmentation avec des projets personnels ( C++ et SDL 2 )
Bonjour,
J'ai un souci depuis plusieurs mois avec gdb il me semble. J' utilise principalement l' IDE Codelite avec g++ (donc du code en C++) et gdb pour développer un jeu (casse briques) et parfois (cela arrive avec d'autres projets C++) lorsque j'exécute mon programme en mode Debug (avec les options : -ggdb3;-O0 // et les options constantes pour mes projets, que ce soit pour Release ou Debug: -std=gnu++2a;-Wall;-Wextra;-pedantic;$(shell sdl2-config --cflags);-Wconversion ) et que gdb tombe sur une erreur de segmentation (SIGSEGV) ou une assert() / assertion (#include <cassert> ) qui échoue les clics de ma souris ne répondent plus (je peux néanmoins voir le curseur bouger et les touches du clavier répondent, notamment la combinaison de touches SHIFT + F5 pour stopper gdb sous Codelite, ce qui m' aide bien). Comme je sais que gdb peut s' utiliser dans un terminal ou en ligne de commande, j'ai tenté de l'utiliser ainsi. Donc je copie le binaire généré ('game') dans un répertoire test de mon casse briques et je lance 'gdb game' dans un terminal puis je tape run. Le jeu se lance (mais ne plante pas) je navigue jusqu' à la scène qui pose problème (une SIGSEGV) et j'ai le même problème qu'avec Codelite, les clics de souris de répondent plus je fais ALT + TAB pour revenir au terminal et je tape exit. J'ai eu des problèmes similaires par le passé (en fait seulement depuis que j'ai installé Xubuntu 24.04.1 à la toute fin août. Avant quand j'avais une erreur de segmentation pour par exemple une texture mal chargée, je voyais la pile d' appel des fonctions dans une fenêtre de Codelite et j' avais la possibilité de voir où je devais corriger mon erreur avec une autre fenêtre qui permettait d' espionner la valeur des variables de mon code et au moment de l'erreur de segmentation gdb me montrait la ligne 'coupable'. J'ai posté plus loin un extrait du texte du terminal lorsque je lance gdb dans celui-ci. J'ai bien fait quelques recherches sur internet (Google et Qwant) mais je n'ai rien trouvé.
Quelques infos supplémentaires:
- J'utilise Xubuntu 24.04.1 (installation fraîche depuis début décembre) avec une partition racine et une partition /home sur SSD mais tous mes projets se trouvent sur une partition de disque dur.
- J'utilise g++ et gdb je n'utilise pas clang jusqu'ici mais si vous me demandez d'essayer je veux bien faire un test.
- J'ai une carte mère MSI Gaming X470 Plus Max avec un Ryzen 5700X 3D et une carte NVidia RTX 2070.
- Quand je tape 'cat /proc/version' dans le terminal j'ai ça:
Linux version 6.8.0-50-generic (buildd@lcy02-amd64-020) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #51-Ubuntu SMP PREEMPT_DYNAMIC Sat Nov 9 17:58:29 UTC 2024
- J' utilise g++-14 comme compilateur depuis les dépôts d'ubuntu (pas ceux du ppa 'toolchain' ).
- Les problèmes décrits ci-dessus arrivent (il me semble) exclusivement lorsque je lie mon programme à la SDL 2 (en version 2.30.0 d'après 'sdl2-config --version' installé depuis les dépôts comme SDL2_image SDL2_ttf ou SDL2_mixer ) ; en mode console ou avec par exemple wxWidgets je n'ai pas rencontré ce genre de problème. A noter que lorsque j'utilise les assertions de la SDL 2 ( #include "SDL_assert.h" ) et que l'assertion échoue le problème survient comme avec les assertions standards (excepté qu'avec les assertions de la SDL2 il y a des boutons (abandonner, réessayer, etc ...) j'avais essayé un temps avec celles-ci mais j'ai abandonné.
- Voici la sortie console de gdb dans mon terminal:
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from game...
(gdb) run
Starting program: /* j'ai éffacé le chemin vers le binaire 'game' ici pour poster sur le forum */ /game
This GDB supports auto-downloading debuginfo from the following URLs:
<https://debuginfod.ubuntu.com>
Enable debuginfod for this session? (y or [n]) n
Debuginfod has been disabled.
To make this setting permanent, add 'set debuginfod enabled off' to .gdbinit.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libpulse.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libopusfile.so.0
warning: could not find '.gnu_debugaltlink' file for /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-16.1.so
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libbrotlidec.so.1
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libglib-2.0.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libpulse-simple.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libjack.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libgmodule-2.0.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libgobject-2.0.so.0
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libbrotlicommon.so.1
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libtinfo.so.6
warning: could not find '.gnu_debugaltlink' file for /lib/x86_64-linux-gnu/libcap.so.2
[New Thread 0x7ffff54006c0 (LWP 7402)]
[New Thread 0x7ffff55ff6c0 (LWP 7403)]
[New Thread 0x7ffff0a006c0 (LWP 7404)]
Thread 1 "game" received signal SIGSEGV, Segmentation fault.
0x00007ffff7e34836 in ?? () from /lib/x86_64-linux-gnu/libSDL2-2.0.so.0
(gdb) exit
A debugging session is active.
Inferior 1 [process 7399] will be killed.
Quit anyway? (y or n) y
Merci de m' avoir lu jusqu' ici.
Dernière modification par Antoine79 (Hier à 17:33)
Hors ligne
#2 Hier à 19:02
- Antoine79
Re : Erreurs de segmentation avec des projets personnels ( C++ et SDL 2 )
Bonsoir,
J' ai du nouveau...
J' ai procédé au test suivant sur mon installation de xubuntu:
Avec virtualbox j'ai créé une machine virtuelle avec Ubuntu 24.04.1 (avec l' iso suivant: ubuntu-24.04.1-desktop-amd64.iso ), donc avec un Ubuntu ordinaire. J'ai mis à jour le nouvel OS installé par sudo apt update puis sudo apt upgrade ; puis j'ai installé le disque de sessions des invités téléchargé sur le site virtualbox d'oracle puis monté l'iso dans la configuration de la machine virtuelle.
Ensuite j'ai tapé la commande suivante dans un terminal de la machine virtuelle créée:
sudo usermod -a -G vboxsf
Ensuite je monte le répertoire de mes projets qui sont sur disque dur dans le répertoire '/media/antoine/mountedProjects' dans la machine virtuelle. En ayant pris soin d' installer les paquets de la SDL2 , build-essential, g++-14, gcc-14 et codelite dans la machine virtuelle je tente une session de debuggage avec gdb avec une assert( false ); bien placée qui fait planter le clic de souris sous xubuntu, mais par contre dans la machine virtuelle nouvellement créée le clic de souris fonctionne , je peux me balader dans la call stack et surveiller les valeurs locales dans l' interface de codelite (j'ai vérifié une seconde fois pour être sur, ça marche pas de freeze/paralysie du clic de souris).
Le bug expliqué sur mon message/post précédent vient peut-être du bureau XFCE ?
Avez-vous des suggestions à me faire ? (il faut que je teste clang et son debugger sous xubuntu pour voir, ça je ne l' ai pas encore fait).
Merci
Hors ligne
#3 Hier à 20:00
- lann
Re : Erreurs de segmentation avec des projets personnels ( C++ et SDL 2 )
Si tu avais compiler en mode debug (-g), on aurait pu en savoir plus ou ça plantait : faire where dans gdb pour avoir les appels aux fonctions.
<Modéré>
Hors ligne
#4 Hier à 21:39
- Antoine79
Re : Erreurs de segmentation avec des projets personnels ( C++ et SDL 2 )
Bonjour Iann,
Ce n'est pas un problème avec mon programme je pense. Et dans mon premier message/post j'ai écrit ceci :
lorsque j'exécute mon programme en mode Debug (avec les options : -ggdb3;-O0 // et les options constantes pour mes projets, que ce soit pour Release ou Debug: -std=gnu++2a;-Wall;-Wextra;-pedantic;$(shell sdl2-config --cflags);-Wconversion )
L'option -ggdb3 est une option de débogage qui permet d'avoir plus de symboles de débogage (ce qui est utilise lorsque l'on a des structures imbriquées, car l'option -g ne permet pas de voir le nom des variables des structures imbriquées, c'est une histoire de récursion de variables dans les paramètres passés aux fonctions).
Le problème auquel je fais face (uniquement avec xubuntu), c'est qu'une fois que j'ai une erreur de segmentation ou une assert() qui 'claque' comme on dit, je ne peux plus utiliser codelite au travers de son interface avec gdb, le clic gauche dans mon système d' exploitation ne répond plus (les raccourcis clavier marchent eux, heureusement), je suis obligé de faire SHIFT+F5 pour arrêter le debugger quand codelite a le focus au lieu de cliquer sur "Debugger" dans le menu et cliquer sur "Stop Debugger". Idem en lançant l' exécutable généré avec gdb dans un terminal, une fois l'assert qui échoue volontairement accédée,...
assert( false );
... le clic gauche de ma souris ne répond plus. J'ai essayé de cliquer sur la barre horizontale en haut de l' écran par exemple sur l'heure et la date affichés, mais le calendrier ne s'affiche pas (les jours du mois en cours dans une mini fenêtre) alors que d'habitude si.
P.S: j'ajoute que pour terminer la session de débogage buguée je fais ALT+TAB pour rebasculer sur le terminal depuis la fenêtre ouverte par mon programme utilisant la SDL 2 et je tape dans le terminal 'exit' puis j'appuie sur 'y' pour confirmer la sortie de gdb.
Dernière modification par Antoine79 (Hier à 21:44)
Hors ligne