none
Es lässt sich nur eine begrenzte Anzahl von Instanzen meiner Anwendung starten. RRS feed

  • Frage

  • Guten Tag,

    ich entwickle eine C++ Anwendung und nutze die MFC Framework. Mit der Umstellung vom Visual Studio 2005 ( MFC 8.0 ) auf das Studio 2010 ( MFC 10 ) setzen wir nun auch das MFC FeaturePack ein und haben in diesem Zug die Programmoberfläche überarbeitet.

    Auf einem Windows XP Rechner ist nun zum ersten Mal aufgefallen, dass sich nur noch 4 Instanzen der Anwendung (mit der neuen Oberfläche) starten lassen. Es lässt sich daraufhin auch kein anderer Prozess mehr ausführen ( Win Explorer, Taskmanager, etc. bleiben alle geschlossen ).
    Im Taskmanager scheint die CPU- und Arbeitsspeicherauslastung normal zu sein.

    Das gleiche Problem lässt sich ohne der neuen Oberfläche auf dem selben Rechner ab ca. 10 Instanzen nachstellen.

    Ich habe dies dann nochmal auf verschiedenen anderen Rechnern getestet:

    Auf einem virtualisiertem XP Rechner tritt das Problem mit 7 Instanzen ( neue Oberfläche ) bzw. 15 Instanzen ( alte Oberfläche ) auf.

    Ein Windows 7 ( Hardware Konfiguration ist bis auf die Grafikkarte zu meinem Identisch ) kann maximal 4 Instanzen mit der neuen Oberfläche und maximal 10 Instanzen mit der alten Oberfläche starten.

    Einen Test auf meinem Entwicklungsrechner habe ich nach 17 geöffneten Instanzen des Programms mit der neuen Oberfläche abgebrochen, da bis zu diesem Zeitpunkt der Fehler nicht aufgetreten ist.


    Wenn sich keine neue Instanz mehr öffnen lässt, dann wird bei jedem Versuch ein Eintrag in das Ereignisprotokoll von Windows geschrieben:
    Section: System
    Quelle: Application Popup
    Kategorie: Keine
    Typ: Information
    Ereignis Kennung: 26
    Beschreibung:

    "Anwendungspopup: Anwendung.exe - Fehler in Anwendung: Die Anwendung konnte nicht richtig initialisiert werden (0xc0000142). Klicken Sie auf 'OK' um die Anwendung zu beenden.

    ... "

    In diesem Zusammenhang habe ich Fehlerbeschreibungen im Internet gefunden, die mit dem Schreiben von Daten auf ein UNC Laufwerk zusammenhängen - Für meinen Test habe ich sichergestellt, dass kein Zugriff auf das Netzwerk stattfindet. Die Recherche hierzu hat nicht weiteres ergeben.


    Als nächstes wollte ich die Codestelle eingrenzen die zum Absturz führt. Hierfür habe ich auf dem virtuellen XP Rechner 6 Instanzen eines Debug-Builds gestartet, die zu Beginn der AfxWinMain-Funktion einen Assert ausgegeben haben. Die Idee war mittels Remote-Debugger mich in den Prozess einzuklinken und Schrittweiße die Ausführung fortzusetzen, bis die Anwendung schließlich abstürzt. Die 7 Instanz, die ich starten wollte hat nicht nur das Remotedebugging lahm gelegt, sondern nicht einmal den eingebauten Assert ausgegeben.

    int AFXAPI AfxWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                           __in LPTSTR lpCmdLine, int nCmdShow)

    Ich persönlich habe hier gerade eine Grenze erreicht, bei der ich nicht mehr weiter weiß. Vermutlich lastet meine Anwendung den Rechner auf irgend eine Art so dermaßen aus, dass das Betriebssystem keinen neuen Prozess mehr starten kann. Nur woran kann ich feststellen, welche Grenze hier überschritten wurde ( Evtl. maximale Anzahl an GDI Objekten? oder ähnliches? ) ?

    Mittels "Process Explorer" habe ich mir die angezeigten Infos der Anwendung angesehen - nur konnte ich hier nichts auffälliges erkennen.

    Ich wäre wirklich über jeden Denkanstoß dankbar!






    Montag, 17. September 2012 09:23

Antworten

  • Hmmm... vielleicht hilft ja das hier:
    http://support.microsoft.com/kb/824422/de

    Ich glaube nicht, dass es direkt mit Deinem Prozess zu tun hat... das muss dann was mit dem OS zu tun haben, wenn es erst nach einigen Starts auftritt und sich in der zwischenzeit nichst geändert hat.

    Nur zur Info: Die Meldung kommt auch, wenn Du eine Anwendung starten willst und gerade eben Windows veranlasst hast runterzufahren...

    Ansonsten: Wende Dich an den MS produkt support. Aber das wird schwer, da Windows XP schon in der extended Support Phase ist... also eigentlich gar nicht mehr richtig unterstützt wird (es gibt nur noch Security-Fixes).


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 20. September 2012 08:29

Alle Antworten

  • Starte doch mal den Task-Manager und schau Dir die Anzahl der GDI handles an.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de


    Dienstag, 18. September 2012 13:16
    Moderator
  • offtopic:
    Wenn sich schon ein so prominenter Schreiber mit meinen Problemen befasst möchte ich hier gleich die Gelegenheit nutzen mich für deinen großartigen Blog zu bedanken. Da sind immer wieder sehr interessante Artikel dabei! U. a. habe ich dort vor etwa 2 Jahren zum ersten Mal vom Remote Debugging gelesen ;-)

    topic:
    Also die Anzahl der GDI Handles ist für mein Problem glaube ich nicht entscheidend. Die Anzahl ist durch das Verwenden des MFC Feature Pack zwar von ~140 auf ~250 angestiegen, allerdings benötigen andere Anwendungen deutlich mehr ( Outlook: 1045; Firefox: 869; Notepad++:357 ).

    Ich habe gestern Abend aber eine interessante Entdeckung gemacht. Um die Software um Funktionalität erweitern zu können gibt es die Möglichkeit dynamisch verschiedene DLLs zu laden. Ich hatte auf meinem System andere Dlls geladen, als auf den anderen Testrechnern - was mir zunächst leider nicht aufgefallen ist. Ich kann den Fehler nun auch auf meinem Entwicklungsrechner nachstellen und konnte die Ursache für dieses Problem deutlich einschränken.

    Im Taskmanager kann man sich die Spalte BENUTZER-Objekte anzeigen lassen. Ich muss gestehen, dass ich vorher nicht wusste, um was es sich dabei handelt und habe hier eine Erklärung gefunden:

    Die momentan vom Prozess verwendete Anzahl von BENUTZER-Objekten. Ein BENUTZER-Objekt ist ein Objekt aus dem Fenster-Manager, das Fenster, Menüs, Cursor, Symbole, Hooks, Beschleuniger, Monitore, Tastaturlayouts und andere interne Objekte enthält.

    Der Wert ist mir zunächst nicht sonderlich aufgefallen, da der Unterschied von der neuen zur alten Version nicht besonders hoch war. Dies lag aber nur daran, dass ich die falschen Dlls geladen hatte. Durch das Laden der dynamischen DLLs steigt der Wert von ~450 auf ~1300 an (neue Oberfläche) bzw. ~250 auf ~550 (alte Oberfläche).

    Diese Erkenntnis bringt mich schon Mal ein ganzes Stück weiter.




    Donnerstag, 20. September 2012 07:48
  • Hmmm... vielleicht hilft ja das hier:
    http://support.microsoft.com/kb/824422/de

    Ich glaube nicht, dass es direkt mit Deinem Prozess zu tun hat... das muss dann was mit dem OS zu tun haben, wenn es erst nach einigen Starts auftritt und sich in der zwischenzeit nichst geändert hat.

    Nur zur Info: Die Meldung kommt auch, wenn Du eine Anwendung starten willst und gerade eben Windows veranlasst hast runterzufahren...

    Ansonsten: Wende Dich an den MS produkt support. Aber das wird schwer, da Windows XP schon in der extended Support Phase ist... also eigentlich gar nicht mehr richtig unterstützt wird (es gibt nur noch Security-Fixes).


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 20. September 2012 08:29
  • Hallo Jonas Brahmsdorf,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 26. September 2012 06:57
    Moderator