Seite 1 von 1
QProcess führt zu Absturz des ausgeführten Programms
Verfasst: 16. Mai 2009 00:35
von kwin
Ich habe ein Programm geschrieben, das mithilfe von c++filt das Name Mangling von C++ Funktionen auflösen kann. Dazu verwende ich QProcess und write zum Schreiben in stdin und read zum Lesen aus stdout.
Beim ersten Aufruf klappt das auch. Aber beim zweiten Aufruf stürzt der c++filt Prozess ab. Im Anhang das Beispielprogramm (noch einmal etwas vereinfacht). Es wäre nett, wenn jemand das bei sich ausprobieren könnte. Bei mir unter Mac OS 10.5.7 funktioniert es nur einmal.
Zum Testen einfach einen beliebigen String eingeben und auf den Button klicken. Das Ergebnis steht dann im Textfeld darunter. Beim zweiten Klick auf den Button funktioniert es nicht mehr.
Ich vermute ein Problem unter Mac OS X mit den Pipes die QProcess nutzt, um auf stdin und stdout zuzugreifen.
Mit Qt 4.4.3 funktioniert bei mir alles, erst mit Qt 4.5.1 kommt es zu diesem Problem. Leider komme ich beim Debugging nicht so richtig weiter. Vielleicht kann mir jemand helfen, so dass ich QtSoftware dann den Bug melden kann. Außerdem wäre interessant, wie sich das Beispiel unter anderen Betriebssystemen verhält.
Danke schonmal im Voraus für jede Hilfe.
Konrad
Verfasst: 16. Mai 2009 11:05
von solarix
zwei Hinweise:
1. bei mir (OsX/PPC/Qt4.4.3) funktioniert es ohne crash (egal, wieviel ich klicke)
2. Ich würde QProcess anderst verwenden: erstens nicht abgeleitet (was bei dir ja gar nicht notwendig gewesen wäre) und zweitens würde ich QProcess nicht wiederverwenden (ich erstelle jeweils dynamisch eine QProcess-Instanz und lösche diese nach Processende wieder).
hth!
PS.
Konstruktoren abgeleiteter Klassen sollten übrigens noch den CTor der abgeleiteten Klasse aufrufen...
Verfasst: 16. Mai 2009 12:04
von kwin
Vielen Dank fürs Testen. Ich verwende dieselbe QProcess-Instanz, weil ich eigentlich sehr viele Namen auflösen will. Würde ich jedesmal einen neuen Prozess starten, würde es zu lange dauern.
Mit dem Ableiten von QProcess hast du Recht. Das ist hier nicht notwendig. Ich werde auch mal Qt 4.4.3 verwenden. Mit Qt 4.5.1 kommt es bei mir zu den beschriebenen Problemen.
Verfasst: 16. Mai 2009 12:09
von Christian81
solarix hat geschrieben:
PS.
Konstruktoren abgeleiteter Klassen sollten übrigens noch den CTor der abgeleiteten Klasse aufrufen...
Häh?
Verfasst: 16. Mai 2009 12:26
von franzf
Christian81 hat geschrieben:solarix hat geschrieben:
PS.
Konstruktoren abgeleiteter Klassen sollten übrigens noch den CTor der abgeleiteten Klasse aufrufen...
Häh?
In dem Fall ist das Häh angebracht. Denn QProcess wird per Default-Konstruktor aufgebaut, bevor der Demangler-Konstruktor ausgeführt wird.
Sollte man aber einen anderen Konstruktor anbieten - QProcess ist ein QObject, da bietet sich ein parent-Argument an - sollte man auch den Konstruktor der Basisklasse mit den passenden Argumenten aufrufen -> Stichwort
Basisintialisierer.
Code: Alles auswählen
Demangler::Demangler( QObject *parent )
: QProcess(parent)
{
// code hier
}
Grüße
Franz
Verfasst: 16. Mai 2009 12:32
von kwin
Nur nochmal zur Klarstellung: Nicht das eigentliche Programm stürzt ab, sondern nur der Kindprozess. Deshalb beim Testen unbedingt die Debugausgaben beobachten.
Verfasst: 16. Mai 2009 13:17
von kwin
In der Tat existiert das Problem nicht mit Qt 4.4.3 aber mit Qt 4.5.1. Kann mir jemand noch beim Debuggen von QProcess weiterhelfen, so dass ich dann den Bug an QtSoftware melden kann? Vielen Dank schonmal für Eure Hilfe bis jetzt.
Konrad
P.S. Ich habe das Beispielprogramm oben noch einmal vereinfacht. Jetzt sollten die Meldungen von QProcess auch direkt in der GUI erscheinen.
Verfasst: 16. Mai 2009 14:02
von solarix
Christian81 hat geschrieben:
Häh?
ich hatte es wohl eilig heute morgen

DU hast mich aber schon verstanden
franzf hat geschrieben:
..Denn QProcess wird per Default-Konstruktor aufgebaut, bevor der Demangler-Konstruktor ausgeführt wird. ..
schon klar.. sonst hätte ich nicht "sollte" geschrieben
kwin hat geschrieben:
In der Tat existiert das Problem nicht mit Qt 4.4.3 aber mit Qt 4.5.1.
Dann würde ich tatsächlich ein möglichst kleines Beispiel schreiben und das via Task Tracker melden..
Verfasst: 16. Mai 2009 14:09
von Christian81
ctor: Akzeptiert - sollte ist ok, ein muss ist es aber nicht. Wenn ich Parameter übergebe bleibt mir sowieso nichts anderes übrig
