QProcess führt zu Absturz des ausgeführten Programms

Alles rund um die Programmierung mit Qt
Antworten
kwin
Beiträge: 4
Registriert: 15. Mai 2009 23:58

QProcess führt zu Absturz des ausgeführten Programms

Beitrag 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
Dateianhänge
QProcessBugV2.zip
Demo-Projekt, das zum Absturz von dem Kindprozess führt
(6.74 KiB) 48-mal heruntergeladen
Zuletzt geändert von kwin am 16. Mai 2009 13:15, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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...
kwin
Beiträge: 4
Registriert: 15. Mai 2009 23:58

Beitrag 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.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

solarix hat geschrieben: PS.
Konstruktoren abgeleiteter Klassen sollten übrigens noch den CTor der abgeleiteten Klasse aufrufen...
Häh?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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
kwin
Beiträge: 4
Registriert: 15. Mai 2009 23:58

Beitrag von kwin »

Nur nochmal zur Klarstellung: Nicht das eigentliche Programm stürzt ab, sondern nur der Kindprozess. Deshalb beim Testen unbedingt die Debugausgaben beobachten.
kwin
Beiträge: 4
Registriert: 15. Mai 2009 23:58

Beitrag 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.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Christian81 hat geschrieben: Häh?
ich hatte es wohl eilig heute morgen :wink: 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 :wink:
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..
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:

Beitrag von Christian81 »

ctor: Akzeptiert - sollte ist ok, ein muss ist es aber nicht. Wenn ich Parameter übergebe bleibt mir sowieso nichts anderes übrig :)
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten