Seite 1 von 1

Programmabsturz bei Signalauslösung

Verfasst: 17. September 2010 15:54
von LonelyPixel
Hallo,

ich habe ein Programm, in dem aus einer Klasse heraus ein Signal eines Objekts mit einem Slot eines anderen Unterobjekts verbunden wird. Die Verbindung funktioniert noch, da gibt es keinen Fehler. Wenn das Signal dann später aber ausgelöst wird, stürzt das Programm sofort ab. Es wird weder der Code nach dem emit, noch der Code in der Slot-Methode aufgerufen. Es handelt sich hier um einen Debug-Build meines Programms, erstellt mit Qt Creator 2.0.1 und Qt 4.3.1 unter OpenSUSE 10.3 (letztere beide sind Projektanforderungen und können nicht geändert werden).

Die Verbindung sieht etwa so aus:

Code: Alles auswählen

class Objects {
public:
    static MyStaticObject s_sender;
}

QObject::connect(&Objects::s_sender, SIGNAL(statusHasChanged(unsigned int, bool*)), SLOT(onStatusHasChanged(unsigned int, bool*)));
Das Programm hält mit SIGSEGV an folgender Stelle an:

Code: Alles auswählen

// SIGNAL 0
void MyClass::statusHasChanged(unsigned int _t1, bool * _t2)
{
    void *_a[] = { 0, const_cast<void*>(reinterpret_cast<const void*>(&_t1)), const_cast<void*>(reinterpret_cast<const void*>(&_t2)) };
    QMetaObject::activate(this, &staticMetaObject, 0, 1, _a);
}
Dieser Code stammt aus einer generierten MOC-Datei wie moc_MyClass.cpp. Also ich hab den Code nicht verbrochen. Noch dazu ist die activate-Methode undokumentiert. Was tut die überhaupt?

Der Fehler tritt in der Zeile mit "QMetaObject" auf. Was ist da passiert? Ich kann hier keinen Fehler erkennen.

(Edit: Beitrag aktualisiert und verkürzt.)

Verfasst: 17. September 2010 16:16
von kater
Ich kenn mich mit C++ zwar nur wenig aus, aber was zum Teufel tust du da?
Diese ganzen Cast sind doch ganz ganz ganz sicher nicht nötig.
Dann kontrolliere doch mal, ob in a_ irgendwas sinnvolles drin steht?

a_ ist doch ein Pointer auf ein Pointer oder? Also ein Array von Pointer.

// edit
Ach der Code ist nicht von dir. Na dann löschen und selbst schreiben ;)

(Das erklärt auch den Unterstrich nach den Variablen)

Verfasst: 17. September 2010 16:27
von LonelyPixel
Sorry, ich hab den Beitrag jetzt mehrmals aktualisiert, so wie er jetzt ist, sollte es passen. Die Funktion, in der der Fehler auftritt, wurde automatisch von Qt generiert. Sie gehört anscheinend zum Qt-Mechanismus der Signals und Slots. Die kann ich nicht löschen. Ich schätze mal, ich werde sie nur los, wenn ich keine Signals verwende. Aber dann brauch ich auch kein Qt mehr...

Verfasst: 17. September 2010 17:07
von kater
Du macht ein Pointer auf ein bool? D.h. du willst in der Slot funktion die bool Variable in dem static Objekt welches das Signal aufruft verändern?

Also du machst da was falsch. Nicht von der Syntax oder Logig her. Ehr von der Art des Programmierens. Kann es nicht begründen, sagt mir mein Gefühl. Es gibt einen besseren Weg, der mehr Sinn macht und das selbe Resultat erzielt.

VErstehe von Qt leider nicht genug um die sagen zu können warum das ein Absturz gibt.

Verfasst: 17. September 2010 17:33
von LonelyPixel
Ach, wie liebe ich C++... (Ich bin auch nicht in C++ zuhause, mache eher C# oder PHP. Das hier ist ein Projekt in der Arbeit...)

Also um es kurz zu machen: Der Fehler ist verschwunden, wie er gekommen ist. Lösung: Einmal alles bereinigen und komplett neu erstellen. (Rebuild all) Danach hat es plötzlich funktioniert. Gott weiß warum. Vielleicht.

Verfasst: 17. September 2010 17:49
von kater
Haha. Ja sowas passiert schonmal. Ein Projekt besteht aus mehreren Datein die natürlich nicht immer alle neu erstellt werden. Und da kann es schonmal passieren, dass irgendwo mal nicht mehr alles zusammen passt. Selten aber es kommt vor.