[C++/QT] probleme erreur de segmentation
Résolu
Bonjour,
voila, j'ai un programme fait avec QT 3.0 qui fonctionne très bien.
Pour ma fenêtre principale, j'ai une class :
clas Form2 : public QMainWindow
{
...
QAction* action1;
...}
Maintenant, j'ai besoin de mettre une action supplémentaire, donc je rajoute :
clas Form2 : public QMainWindow
{
...
QAction* action1;
QAction* action2;
...}
Et là : erreur de segmentation à l'exécution.
Pour testé, je commente tout ce qui concerne action1, je recompile et là aucun problème !
action1 fonctionne sans action2, et action2 fonctionne sans action1, mais pas les deux ensemble.
J'ai l'impression que c'est comme si la class ne pouvait pas contenir plus d'un certain nombre de membre. En tout cas pour l'instant, je ne vois pas d'autre explication.
dans le .cpp, je fait des new QAction qui passent sans problème, donc ça ne viens pas de là.
voila, j'ai un programme fait avec QT 3.0 qui fonctionne très bien.
Pour ma fenêtre principale, j'ai une class :
clas Form2 : public QMainWindow
{
...
QAction* action1;
...}
Maintenant, j'ai besoin de mettre une action supplémentaire, donc je rajoute :
clas Form2 : public QMainWindow
{
...
QAction* action1;
QAction* action2;
...}
Et là : erreur de segmentation à l'exécution.
Pour testé, je commente tout ce qui concerne action1, je recompile et là aucun problème !
action1 fonctionne sans action2, et action2 fonctionne sans action1, mais pas les deux ensemble.
J'ai l'impression que c'est comme si la class ne pouvait pas contenir plus d'un certain nombre de membre. En tout cas pour l'instant, je ne vois pas d'autre explication.
dans le .cpp, je fait des new QAction qui passent sans problème, donc ça ne viens pas de là.
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 4101 france tv - Forum Lecteurs et supports vidéo
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
7 réponses
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
???
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.
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
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
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
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.
#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