[C++/QT] probleme erreur de segmentation
Résolu/Fermé
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
-
4 avril 2008 à 10:44
mamiemando Messages postés 33407 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 novembre 2024 - 9 avril 2008 à 10:00
mamiemando Messages postés 33407 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 29 novembre 2024 - 9 avril 2008 à 10:00
A voir également:
- Erreur de segmentation c
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur 1001 outlook - Accueil - Bureautique
- Erreur 38 free ✓ - Forum Mobile
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
7 réponses
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
9 avril 2008 à 10:00
9 avril 2008 à 10:00
Bah quand tu as une seg fault la première à chose à faire c'est de recompiler complètement le programme. Si la seg fault persiste c'est qu'il y a une erreur et tu compiles en -g, puis tu lances le débuggueur. Une seg fault peut se déclarer après "l'erreur" si par chance cette erreur restait dans une zone mémoire que ton programme utilisait.
Il peut arriver que l'erreur ne se déclare pas avec gdb, car gdb espace n'agence pas la mémoire de la même façon que ton programme quand tu l'exécute. Ce sont évidemment les erreurs les plus difficile à localiser. Dans son cas la seul solution, c'est de localiser jusqu'où arrive le programme à coup de printf.
Bonne chance
Il peut arriver que l'erreur ne se déclare pas avec gdb, car gdb espace n'agence pas la mémoire de la même façon que ton programme quand tu l'exécute. Ce sont évidemment les erreurs les plus difficile à localiser. Dans son cas la seul solution, c'est de localiser jusqu'où arrive le programme à coup de printf.
Bonne chance
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
9 avril 2008 à 08:53
9 avril 2008 à 08:53
???
Alors, là c'est ne plus rien y comprendre, je fait du menage pour envoyer un projet propre et tout : le problème a disparu.
Je pense que ça venait d'une blague classique de la mémoire du C++.
En compilant sur windows, j'ai eu des erreurs de segmentations que j'ai trouvé, elle venaient d'une allocation d'un tableau de caractère un peu juste (1 case).
Par contre l'erreur était étrange : le programme lancé classiquement sous Windows génèrait une erreur de segmentation, mais lancé avec gdb, il n'en produisait plus : pas facile de trouver le lieu de l'erreur.
Problème temporairement résolue.
Alors, là c'est ne plus rien y comprendre, je fait du menage pour envoyer un projet propre et tout : le problème a disparu.
Je pense que ça venait d'une blague classique de la mémoire du C++.
En compilant sur windows, j'ai eu des erreurs de segmentations que j'ai trouvé, elle venaient d'une allocation d'un tableau de caractère un peu juste (1 case).
Par contre l'erreur était étrange : le programme lancé classiquement sous Windows génèrait une erreur de segmentation, mais lancé avec gdb, il n'en produisait plus : pas facile de trouver le lieu de l'erreur.
Problème temporairement résolue.
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
4 avril 2008 à 15:13
4 avril 2008 à 15:13
Compile ton programme avec l'option -g, puis lance le programme via le debugger (par exemple gdb). Lance le programme :
Quand le segmentation fault se déclenche tape :
Comme ça tu sauras exactement où a lieu l'erreur. De toute façon sans le code on ne peut pas t'aider...
Quelques astuces :
- préférer les références aux pointeurs : même efficacité, plus agréables syntaxiquement parlant, et contrairement à un pointeur, toujours initialisé
- quand tu insères une donnée dans un container (genre std::vector) tu peux utiliser la méthode at( ) au lieu de [ ] qui est plus lent mais qui contrôle que tu es toujours dans le vector.
- place des assert pour contrôler que les données sont cohérentes (header <cassert>). Par exemple :
Bonne chance
r param1 param2 param3....
Quand le segmentation fault se déclenche tape :
bt
Comme ça tu sauras exactement où a lieu l'erreur. De toute façon sans le code on ne peut pas t'aider...
Quelques astuces :
- préférer les références aux pointeurs : même efficacité, plus agréables syntaxiquement parlant, et contrairement à un pointeur, toujours initialisé
- quand tu insères une donnée dans un container (genre std::vector) tu peux utiliser la méthode at( ) au lieu de [ ] qui est plus lent mais qui contrôle que tu es toujours dans le vector.
- place des assert pour contrôler que les données sont cohérentes (header <cassert>). Par exemple :
assert(!tableau.empty());
Bonne chance
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
4 avril 2008 à 17:04
4 avril 2008 à 17:04
Merci de la réponse, mais ça ne viens pas de là, ou alors trop bizarrement...
le problème de gdb, c'est que ça fonctionne pas :
en gros, j'ai :
Bref, je sais pas d'où ça viens. Je mettrais les infos complete, et peut être le code lundi.
Bon week'end
le problème de gdb, c'est que ça fonctionne pas :
en gros, j'ai :
#0 in ?? ... #1 in QScrollDataview::... from libqt-mt.so ...
Bref, je sais pas d'où ça viens. Je mettrais les infos complete, et peut être le code lundi.
Bon week'end
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
4 avril 2008 à 19:50
4 avril 2008 à 19:50
Il faut que tu nettoyes tes fichiers .o et que tu les recompiles avec l'option -g si ce n'est pas le cas, car tu devrais au moins avoir la ligne du main correspondante (et toutes les fonctions en cours d'appel). Sinon gdb ne peut pas trop t'aider. Si la segfault se déclenche dans libqt-mt.so c'est probablement que tu lui passes des paramètres incohérents (pointeurs incompatibles ou pas initialisés, valeurs incohérentes etc...).
Bonne chance
Bonne chance
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
7 avril 2008 à 10:07
7 avril 2008 à 10:07
Je sais tout ça. Voici ce que donne gdb, et qui ne m'avance pas trop :
Le simple ajout de ActionTest dans le .h suffit à générer l'erreur. Par contre, si je commente une autre QAction (ainsi que ses différents appels dans les .cpp) l'erreur disparaît.
#0 0x00000011 in ?? () #1 0xb72ccf3d in QScrollViewData::QScrollViewData(QScrollView*, int) () from /usr/lib/qt-3.1/lib/libqt-mt.so.3 #2 0xb72c7494 in QScrollView::QScrollView(QWidget*, char const*, unsigned) () from /usr/lib/qt-3.1/lib/libqt-mt.so.3 #3 0xb7305f55 in QTextEdit::QTextEdit(QWidget*, char const*) () from /usr/lib/qt-3.1/lib/libqt-mt.so.3 #4 0x0805ad0d in Form2 (this=0xbfff9c30, parent=0xbfff9d80, name=0x80fb920 "èç[·\002", fl=3221200256) at .ui/form2.cpp:114 #5 0x08050d36 in main (argc=1, argv=0x80fb630) at main.cpp:13Voici une partie du .h :
class Form2 : public QMainWindow { Q_OBJECT public: Form2( QWidget* parent = 0, const char* name = 0, WFlags fl = WType_TopLevel ); ~Form2(); QLabel* textLabel2; QLabel* textLabel1; QLabel* textLabel3; QLineEdit* lineEdit5; QLineEdit* lineEdit6; QLineEdit* lineEdit7; QCheckBox* checkRich; QTabWidget* tabWidget2; QWidget* tab; QTextEdit* textEdit1; QWidget* tab_2; QTextEdit* textEdit2; QWidget* tab_3; QTextEdit* textEdit3; QPushButton* STOP_button; QMenuBar *menubar; QPopupMenu *fileMenu; QPopupMenu *editMenu; QPopupMenu *PopupMenu; QPopupMenu *helpMenu; QToolBar *toolBar; QToolBar *Toolbar; QToolBar *Toolbar_2; QToolBar *Toolbar_3; QAction* fileNewAction; QAction* fileOpenAction; QAction* fileSaveAction; QAction* fileSaveAsAction; QAction* fileExitAction; QAction* editUndoAction; QAction* editRedoAction; QAction* editCutAction; QAction* editCopyAction; QAction* editPasteAction; QAction* editFindAction; QAction* helpContentsAction; QAction* helpIndexAction; QAction* helpAboutAction; QAction* MC3D; QAction* Lancement; QAction* resu; QAction* configPATH; QAction* MultiCalc; QAction* LanceMulti; QAction* Plot; QAction* fort77; QAction* VisIt; QAction* Export; QAction* ExportSh; QAction* Couleurs; QAction* ActionTest; ...
Le simple ajout de ActionTest dans le .h suffit à générer l'erreur. Par contre, si je commente une autre QAction (ainsi que ses différents appels dans les .cpp) l'erreur disparaît.
mamiemando
Messages postés
33407
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
29 novembre 2024
7 806
7 avril 2008 à 16:25
7 avril 2008 à 16:25
#4 0x0805ad0d in Form2 (this=0xbfff9c30, parent=0xbfff9d80, name=0x80fb920 "èç[·\002", fl=3221200256) at .ui/form2.cpp:114 #5 0x08050d36 in main (argc=1, argv=0x80fb630) at main.cpp:13
Bah il faut voir ce que tu as écris dans ui/form2.cpp à la ligne 114. QUe veux tu que je fasse d'un .hpp incomplet :-)
Bonne chance