QProcess führt zu Absturz des ausgeführten Programms
QProcess führt zu Absturz des ausgeführten Programms
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
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
- Dateianhänge
-
- QProcessBugV2.zip
- Demo-Projekt, das zum Absturz von dem Kindprozess führt
- (6.74 KiB) 49-mal heruntergeladen
Zuletzt geändert von kwin am 16. Mai 2009 13:15, insgesamt 1-mal geändert.
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...
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...
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.
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.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
In dem Fall ist das Häh angebracht. Denn QProcess wird per Default-Konstruktor aufgebaut, bevor der Demangler-Konstruktor ausgeführt wird.Christian81 hat geschrieben:Häh?solarix hat geschrieben: PS.
Konstruktoren abgeleiteter Klassen sollten übrigens noch den CTor der abgeleiteten Klasse aufrufen...
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
}Franz
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.
Konrad
P.S. Ich habe das Beispielprogramm oben noch einmal vereinfacht. Jetzt sollten die Meldungen von QProcess auch direkt in der GUI erscheinen.
ich hatte es wohl eilig heute morgenChristian81 hat geschrieben: Häh?
schon klar.. sonst hätte ich nicht "sollte" geschriebenfranzf hat geschrieben: ..Denn QProcess wird per Default-Konstruktor aufgebaut, bevor der Demangler-Konstruktor ausgeführt wird. ..
Dann würde ich tatsächlich ein möglichst kleines Beispiel schreiben und das via Task Tracker melden..kwin hat geschrieben: In der Tat existiert das Problem nicht mit Qt 4.4.3 aber mit Qt 4.5.1.
Zuletzt geändert von solarix am 16. Mai 2009 14:50, insgesamt 1-mal geändert.
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten: