Seite 1 von 1

Speicherfehler! Segmentation fault; Exited with status 139

Verfasst: 25. November 2008 19:02
von Fvzzl3
Hallo,

ich bin noch nicht lange ein "QTler". In letzter Zeit habe ich mich aber mal dran gegeben etwas mehr zu tun.
Nun habe ich aber ein höchst merkwürdiges Problem.

Kompiliere ich meinen Code, so kann der Code bis zum Ende erfolgreich kompiliert werden.
Schreibe ich dann aber etwas in mein TextEdit, so schießt sich das Programm und ich bekomme einen Speicherfehler im KDevelop.

Segmentation fault
*** Exited with status 139 ***

Per Connect habe ich das TextEdit mit einem textChanged verpunden, dass eine Methode namens "updateStatuszeile (void)" aufruft.
In dieser wiederum wird eine Methode namens "countWords()" aufgerufen.
Kommentiere ich die "countWords()" komplett aus, läuft das Programm.

Nehme ich den Kommentar weg und setze einen einfachen Zeilenumbruch (also einfach ein "Enter" der Tastatur) in den Code, funktioniert das Compiling wieder und der Code ist lauffähig. Wehe aber ich ändere die "mainform.ui" im QT4 Designer. Wenn ich auch nur eine neue "action" einfüge, bekomme ich den gleichen Fehler (s.o.), nachdem ich eine Tastatureingabe im textEdit gemacht habe. Setze ich wieder einen Zeilenumbruch in den Code, klappt es wieder, bis ich etwas im Designer ändere.

Jemand eine Idee?

MFG
Fvzzl3


Code:

0. Durch diesen Connect geht der Fehler aus:

Code: Alles auswählen

connect( textEdit, SIGNAL( textChanged() ), this, SLOT( updateStatuszeile() ) );
1. updateStatuszeile(void) //Wird per Connect bei Textänderung vom textEdit aufgerufen

Code: Alles auswählen

void MainForm::updateStatuszeile (void)
{
int words = countWords();

status.setText(trUtf8("Wörter: ")+QString::number(words));

statusBar()->insertPermanentWidget(0, &status);
}
2. countWords(void)

Code: Alles auswählen

int MainForm::countWords()
{
  QString text = textEdit->toPlainText();

  text.replace('\n', " ");

  text = text.simplified(); //Unnötige Leerzeichen entfernen
  int wordtest = text.count( " " ); //Leerzeichen zählen
  wordtest++; //Da am Ende das Wort kein Leerzeichen mehr besitzt.

  return wordtest;
}

Verfasst: 25. November 2008 20:10
von solarix
1. was meint denn der Debugger dazu?
2. zu dem "Vollständigen Code" würde noch die "mainform.h" gehören

Verfasst: 25. November 2008 21:58
von Fvzzl3
Der Debugger gibt folgende Fehlermeldung:
Program received signal SIGSEGV (Segmentation fault)

Ich weiss nicht, ob es etwas bringt, aber im Disassemle steht folgendes:
[cod]
0xb756ea60 QMetaObject::activate(QObject*, int, int, void**)+512 mov -0x14(%ebp),%eax
0xb756ea63 QMetaObject::activate(QObject*, int, int, void**)+515 test %eax,%eax
0xb756ea65 QMetaObject::activate(QObject*, int, int, void**)+517 je 0xb756ea6f <QMetaObject::activate(QObject*, int, int, void**)+527>
0xb756ea67 QMetaObject::activate(QObject*, int, int, void**)+519 test $0x1,%al
0xb756ea69 QMetaObject::activate(QObject*, int, int, void**)+521 je 0xb756eb28 <QMetaObject::activate(QObject*, int, int, void**)+712>
0xb756ea6f QMetaObject::activate(QObject*, int, int, void**)+527 mov -0x204(%ebx),%edx
0xb756ea75 QMetaObject::activate(QObject*, int, int, void**)+533 mov 0xc(%edx),%eax
0xb756ea78 QMetaObject::activate(QObject*, int, int, void**)+536 test %eax,%eax
0xb756ea7a QMetaObject::activate(QObject*, int, int, void**)+538 je 0xb756ea85 <QMetaObject::activate(QObject*, int, int, void**)+549>
0xb756ea7c QMetaObject::activate(QObject*, int, int, void**)+540 mov %esi,0x4(%esp)
0xb756ea80 QMetaObject::activate(QObject*, int, int, void**)+544 mov %edi,(%esp)
0xb756ea83 QMetaObject::activate(QObject*, int, int, void**)+547 call *%eax
0xb756ea85 QMetaObject::activate(QObject*, int, int, void**)+549 mov -0x38(%ebp),%ecx
0xb756ea88 QMetaObject::activate(QObject*, int, int, void**)+552 mov %ecx,0x8(%esp)
0xb756ea8c QMetaObject::activate(QObject*, int, int, void**)+556 mov -0x50(%ebp),%eax
0xb756ea8f QMetaObject::activate(QObject*, int, int, void**)+559 mov %edi,(%esp)
0xb756ea92 QMetaObject::activate(QObject*, int, int, void**)+562 mov %eax,0x4(%esp)
0xb756ea96 QMetaObject::activate(QObject*, int, int, void**)+566 call 0xb7454e4c <_ZN14QObjectPrivate18resetCurrentSenderEP7QObjectPNS_6SenderES3_@plt>
0xb756ea9b QMetaObject::activate(QObject*, int, int, void**)+571 mov -0x48(%ebp),%edx
0xb756ea9e QMetaObject::activate(QObject*, int, int, void**)+574 cmpb $0x0,0x4(%edx)
0xb756eaa2 QMetaObject::activate(QObject*, int, int, void**)+578 je 0xb756e998 <QMetaObject::activate(QObject*, int, int, void**)+312>
0xb756eaa8 QMetaObject::activate(QObject*, int, int, void**)+584 mov -0x48(%ebp),%ecx
0xb756eaab QMetaObject::activate(QObject*, int, int, void**)+587 mov 0x8(%ecx),%eax
0xb756eaae QMetaObject::activate(QObject*, int, int, void**)+590 sub $0x1,%eax
0xb756eab1 QMetaObject::activate(QObject*, int, int, void**)+593 cmpb $0x0,0x4(%ecx)
0xb756eab5 QMetaObject::activate(QObject*, int, int, void**)+597 mov %eax,0x8(%ecx)
0xb756eab8 QMetaObject::activate(QObject*, int, int, void**)+600 je 0xb756eac2 <QMetaObject::activate(QObject*, int, int, void**)+610>
0xb756eaba QMetaObject::activate(QObject*, int, int, void**)+602 test %eax,%eax
0xb756eabc QMetaObject::activate(QObject*, int, int, void**)+604 je 0xb756ec95 <QMetaObject::activate(QObject*, int, int, void**)+1077>
0xb756eac2 QMetaObject::activate(QObject*, int, int, void**)+610 mov -0x14(%ebp),%edi
0xb756eac5 QMetaObject::activate(QObject*, int, int, void**)+613 test %edi,%edi
0xb756eac7 QMetaObject::activate(QObject*, int, int, void**)+615 je 0xb756ead4 <QMetaObject::activate(QObject*, int, int, void**)+628>
0xb756eac9 QMetaObject::activate(QObject*, int, int, void**)+617 mov -0x14(%ebp),%eax
0xb756eacc QMetaObject::activate(QObject*, int, int, void**)+620 test $0x1,%al
0xb756eace QMetaObject::activate(QObject*, int, int, void**)+622 jne 0xb756ed08 <QMetaObject::activate(QObject*, int, int, void**)+1192>
0xb756ead4 QMetaObject::activate(QObject*, int, int, void**)+628 mov -0x204(%ebx),%edx
0xb756eada QMetaObject::activate(QObject*, int, int, void**)+634 mov 0x8(%edx),%eax
0xb756eadd QMetaObject::activate(QObject*, int, int, void**)+637 test %eax,%eax
0xb756eadf QMetaObject::activate(QObject*, int, int, void**)+639 je 0xb756eaf0 <QMetaObject::activate(QObject*, int, int, void**)+656>
[/code]

2. Entschuldigt. Ist nun drin.


Gruß
Fvzzl3

Verfasst: 25. November 2008 22:17
von Christian81
Abgesehen von der etwas kostspieligen Wortzählerrei (in From von CPU-lastig) funktioniert es bei mir mit 4.4.3 unter Windows mit MSVC8

Verfasst: 25. November 2008 22:18
von upsala
1. Hier stürzt nichts ab.
2. Schadet es nicht, die Funktionsweise des Debuggers mal zu erlernen.
3. Wäre der Stack-Trace viel interessanter

Verfasst: 25. November 2008 22:37
von Fvzzl3
Guten Abend,

da ich mit QT wirklich noch nicht viel gemacht habe und absoluter newbie auf diesem gebiet bin, habe ich wirklich noch garnicht mit dem debugger gearbeitet.

Wie kann ich mir denn den Inhalt des Stack-Traces auslesen?

MFG
Fvzzl3

Verfasst: 26. November 2008 07:21
von upsala
Aufrufliste? Qt ist eine Bibliothek für C++, d.h. C++-Grundlagen solltest du dir schon aneignen, dazu gehört auch die Verwendung eines Debuggers.

Verfasst: 26. November 2008 08:18
von solarix
Bei mir (Linux/uralt Qt 4.2.3) funktioniert es ebenfalls... was aber noch nicht zwangsläufig heisst, dass es fehlerfrei ist (Pointerbasteleien führen zu undefiniertem Verhalten).

1. Abgesehen vom unnötig oft aufgerufenem

Code: Alles auswählen

  statusBar()->insertPermanentWidget(0, &status);
(1x im Konstruktor würde ja reichen) und üblem Codestyle kann ich nichts erkennen..

2. Welche Qt-Version hast du? QMainWindow hat ziemlich viele Einträge im Task Tracker...

3. Den Debugger solltest du wirklich kennenlernen...

Verfasst: 26. November 2008 14:35
von Fvzzl3
1.

Code: Alles auswählen

 statusBar()->insertPermanentWidget(0, &status); 
Okay, ist gefixt.

2. Ich nutze die QT 4.4.3 Version.

3. Werde ich tun, Danke.

erledigt. QMAKE hat gefehlt

Verfasst: 27. November 2008 12:54
von Fvzzl3
Hallo,

ist nun erledigt. Ein einfaches "qmake" nach dem ändern der *.ui Datei hätte gereicht.
KDevelop macht nur ein einfaches "make".

Danke dennoch für eure Antworten!


Gruß
Fvzzl3