[C++/QT] probleme erreur de segmentation

Résolu/Fermé
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 4 avril 2008 à 10:44
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 9 avril 2008 à 10:00
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à.

7 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
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
2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
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.
1
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
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 :
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
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 :
#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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
7 avril 2008 à 10:07
Je sais tout ça. Voici ce que donne gdb, et qui ne m'avance pas trop :
#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:13
Voici 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.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
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
0