Wie beendet Visual Studio den Debugging Prozess?
-
Hallo tolle Community
Ich habe ein kleines Problem mit meiner Entwicklungsumgebung.
Ich habe ein Programm, was single threaded läuft und nach dem Kompilieren im Debug und Release auch sauber funktioniert. Soweit, so gut.
Um das folgende Verhalten nachzustellen, habe ich im Dekonstruktor meiner MFC Anwendung im Hauptdialog eine Logeingabe eingebaut die loggt, wenn das Programm darüber sauber geschlossen wurde (wichtig, da dieser Dekonstruktur z.B. auch injezierte DLLs wieder entfernt!)
Wenn ich jetzt über VS2010 debugge und debugging stoppe (Umschalt + F5), loggt diese Meldung nicht, d.h. die Anwendung wird nicht über den Dekonstruktor geschlossen.
Könnt ihr mir sagen, wie ich das abfangen kann? Ruft das Beenden beim Debuggen nicht OnOk() des MFC-Dialogs auf?
Viele Grüße,
Martin
-
Wenn du das Debuggen abbrichst kann VS doch kaum was anderes machen als den Prozess einfach zu killen!?
Der Stop Knopf beendet jedenfalls nicht "sauber", sondern ca. so wie wenn du den Prozess über den Taskmanager terminieren würdest...
-
Wieso ruft Visual Studio nicht OnOk() auf und schließt die Anwendung normal?
Wenn ich im Debug-Modus die Anwendung über die GUI schließe, erscheint folgender Fehler:Das Programm "[980] test.exe: Systemeigen" wurde mit Code 3 (0x3) beendet.
Grüße,
Martin
-
milchbart schrieb:
Wieso ruft Visual Studio nicht OnOk() auf und schließt die Anwendung normal?
Woher soll Visual Studio bitte wissen dass man deine konkrete Anwendung über irgendeinen Aufruf irgendeiner Funktion "schließen" kann!?
Abgesehen davon wär das eben genau nicht der Sinn des Stop Buttons. Wenn du die Anwendung "normal" schließen willst, dann schließ sie eben "normal"...milchbart schrieb:
Wenn ich im Debug-Modus die Anwendung über die GUI schließe, erscheint folgender Fehler:
Das Programm "[980] test.exe: Systemeigen" wurde mit Code 3 (0x3) beendet.
Das ist kein Fehler, sondern einfach nur eine Meldung die dir sagt, dass dein Prozess mit dem Rückgabewert 3 beendet hat.
-
D.h. ich habe jetzt genau zwei Möglichkeiten:
1. Bei Programmstart (egal ob Release oder Debug) prüfen ob injezierte DLL noch geladen ist und diese entfernen
2. Programm im Debug-Mode NICHT mehr über Stopp stoppen, sondern sauber über die Applikation?Grüße,
Martin
-
Wenn dein Prozess beendet, egal auf welche Art, kümmert sich selbstverständlich das Betriebssystem darum, sämtliche dlls die der Prozess geladen hat zu entladen...
-
dot schrieb:
Wenn dein Prozess beendet, egal auf welche Art, kümmert sich selbstverständlich das Betriebssystem darum, sämtliche dlls die der Prozess geladen hat zu entladen...
Hallo,
dem ist leider nicht so, da der Inhalt der DLL ja im anderen Prozess als Thread läuft. Dieser Teil wird nicht entfernt. Starte ich meine Anwendung wieder (die wieder versucht in diesen Bereich des Speichers zu kommen), scheitert diese.
Deshalb suche ich eine Möglichkeit, diesen Bereich, entweder bei Absturz meiner Applikation oder Beenden aus dem Debug heraus, zu säubern, so dass ein erneutes injezieren möglich ist.
Grüße,
Martin
-
Oh, verstehe. In dem Fall wird wohl evtl. ein Exception Handler helfen?
-
Bin mir nicht 100%ig sicher. Folgender Meldung erscheint im Ausgabefenster von VS2010:
Eine Ausnahme (erste Chance) bei 0x7c812afb in test.exe: Microsoft C++-Ausnahme: CArchiveException an Speicherposition 0x0012e420..
Wenn mein Programm die Injektion erfolgreich durchführt, kommt diese Meldung nicht.
Grüße,
Martin