Wie erfahre ich mehr über das Ereignis Application Hang?

8

Wenn eine VB6-Anwendung das Ereignis " Application Hang " in der Ereignisanzeige anzeigt, wie kann ich herausfinden, warum die Anwendung nicht mehr funktioniert?

Bedeutet ein Application Hang -Ereignis, dass die App eingefroren und abgestürzt ist oder nur vorübergehend hängt?

Alles, was ich im Ereignisprotokoll für dieses Ereignis bekomme, ist:

%Vor%

Das ist nicht genug und ich möchte mehr darüber erfahren, warum es hängt. Welche Codeänderungen oder andere Schritte müssen durchgeführt werden, damit die App mehr Details im Ereignisprotokoll bereitstellt?

    
CJ7 05.04.2012, 12:41
quelle

4 Antworten

5

Ich empfehle die Verwendung des Windows Performance Toolkits. Die beste zu verwendende Version ist Windows Assessment & amp; Deployment Kit, Ссылка

Nach der Installation starten Sie den Windows Performance Recorder (WPR) und klicken auf die Schaltfläche Start, um mit der Aufzeichnung zu beginnen. Als nächstes reproduzieren Sie das Problem mit Ihrer App. Dann gehe zurück zu WPR und drücke die Speichern-Taste. Laden Sie als Nächstes Windows Performance Analyzer und öffnen Sie die * .ETL-Datei, die generiert wurde. Dann möchten Sie im Diagramm-Explorer zum Abschnitt Systemaktivität wechseln, ihn erweitern und das Diagramm UI-Verzögerungen suchen (oder es könnte das erste Diagramm sein, das auf Systemaktivität geparkt wurde). Doppelklicken Sie darauf, um die detaillierte Version in einer Analyse-Registerkarte zu erhalten.

Sobald Sie die gewünschte Verzögerung für die Benutzeroberfläche gefunden haben, können Sie im Graph Explorer einen weiteren Graphen, z. B. CPU-Auslastung (Sampled), aus dem Knoten Verarbeitung hinzufügen. Wenn sich die beiden Diagramme auf derselben Analyse-Registerkarte befinden, werden ihr Scrollen und ihre Auswahl synchronisiert. Sie können also auf das Verzögerungsereignis für die Benutzeroberfläche klicken und es wird auch der entsprechende Bereich in der CPU-Auslastung hervorgehoben.

    
Rick Brewster 25.04.2012, 23:38
quelle
2
___ answer10325311 ___

Ich empfehle die Verwendung des Windows Performance Toolkits. Die beste zu verwendende Version ist Windows Assessment & amp; Deployment Kit, Ссылка

Nach der Installation starten Sie den Windows Performance Recorder (WPR) und klicken auf die Schaltfläche Start, um mit der Aufzeichnung zu beginnen. Als nächstes reproduzieren Sie das Problem mit Ihrer App. Dann gehe zurück zu WPR und drücke die Speichern-Taste. Laden Sie als Nächstes Windows Performance Analyzer und öffnen Sie die * .ETL-Datei, die generiert wurde. Dann möchten Sie im Diagramm-Explorer zum Abschnitt Systemaktivität wechseln, ihn erweitern und das Diagramm UI-Verzögerungen suchen (oder es könnte das erste Diagramm sein, das auf Systemaktivität geparkt wurde). Doppelklicken Sie darauf, um die detaillierte Version in einer Analyse-Registerkarte zu erhalten.

Sobald Sie die gewünschte Verzögerung für die Benutzeroberfläche gefunden haben, können Sie im Graph Explorer einen weiteren Graphen, z. B. CPU-Auslastung (Sampled), aus dem Knoten Verarbeitung hinzufügen. Wenn sich die beiden Diagramme auf derselben Analyse-Registerkarte befinden, werden ihr Scrollen und ihre Auswahl synchronisiert. Sie können also auf das Verzögerungsereignis für die Benutzeroberfläche klicken und es wird auch der entsprechende Bereich in der CPU-Auslastung hervorgehoben.

    
___ answer10235300 ___

Ich würde das angehen, indem ich den Code in dem Modul durchforste, den Windows bestimmt hat, und dessen Name in das Ereignisprotokoll geschrieben wurde. Der Versuch, mehr Details im Hängeereignis zu erhalten, ist nicht möglich, da, wenn Windows festgestellt hat, dass die App nicht mehr reagiert, es zu spät ist.

In das hängende Modul würde ich DoEvents mehrere Aufrufe hinzufügen und Statusmeldungen direkt im EventLog protokollieren. Wenn Sie an dieser Stelle ein Protokollierungsframework hinzufügen, führt dies zu Komplexität und erfordert entweder einen Datenbank- oder Dateizugriff, in dem die Protokolle gespeichert werden.

Windows denkt, dass die App nicht mehr reagiert, weil sie nicht mehr auf Nachrichten reagiert. Leider ist das Implementieren eines zweiten Threads in Ihrer VB6-Anwendung im Gegensatz zu .NET nicht trivial. Nichtsdestoweniger würde das Hinzufügen eines anderen Threads die App ansprechen lassen, aber dann wäre es wahrscheinlich immer noch die Frage zu beantworten: "Warum dauert die Ausführung des Codes so lange?"

    
___ qstnhdr ___ Wie erfahre ich mehr über das Ereignis Application Hang? ___ antwort10230121 ___

Das Ereignis Application Hang bedeutet, dass Windows entschieden hat, dass die Anwendung nicht mehr reagiert. Da das Ereignis vom Betriebssystem und nicht von der Anwendung generiert wird, sind Ihre Möglichkeiten, zusätzliche Informationen zu dem Ereignis zu erhalten, äußerst begrenzt.

Dies scheint bei einem Application Hang-Ereignis verfügbar zu sein:

Nachricht: Hängende Anwendung% 1, Version% 2, Modul% 3 hängen, Version% 4, Adresse 0x% 5 hängen.

Von:

Ссылка

Wenn Sie der Ansicht sind, dass die Ursache des Ereignisses etwas ist, das Ihre Anwendung ausführt (im Gegensatz zu etwas in der Umgebung, in dem die Anwendung ausgeführt wird), sollten Sie anstelle von Informationen an das Hang-Ereignis erhöhen Log-Informationen in den Debug-Modus und schauen in der Log-Datei Ihrer Anwendung, um zu sehen, was es gerade macht, bevor es nicht mehr reagiert.

Wenn Sie in Ihrer Anwendung keine Protokollierungsinformationen oder ein Protokollierungsframework haben, sollten Sie sich auf das konzentrieren. Der Vorteil ist, dass Sie auch in Zukunft von besserem Logging profitieren werden. Verwenden Sie jedoch ein Protokollierungs-Framework, damit Sie die Debug-Level-Protokollierung in einer Produktionsumgebung deaktivieren können, wenn alles reibungslos funktioniert.

    
___ answer10332640 ___

Das Erhalten von Informationen aus der Windows-Ereignisperspektive wird nicht helfen. Versuchen Sie, Tracing in Ihrer Anwendung zu haben, die Ihnen hilft, die genaue Ursache zu finden.

    
___ tag123eventlog ___ Ein Ereignisprotokoll ist eine Datei, die zum Aufzeichnen einer Zeitleiste von Ereignissen zusammen mit kontextbezogenen Metadaten verwendet wird ___ qstntxt ___

Wenn eine VB6-Anwendung das Ereignis " %code% " in der Ereignisanzeige anzeigt, wie kann ich herausfinden, warum die Anwendung nicht mehr funktioniert?

Bedeutet ein %code% -Ereignis, dass die App eingefroren und abgestürzt ist oder nur vorübergehend hängt?

Alles, was ich im Ereignisprotokoll für dieses Ereignis bekomme, ist:

%Vor%

Das ist nicht genug und ich möchte mehr darüber erfahren, warum es hängt. Welche Codeänderungen oder andere Schritte müssen durchgeführt werden, damit die App mehr Details im Ereignisprotokoll bereitstellt?

    
___ tag123hang ___ Ein Absturz tritt auf, wenn ein Programm nicht mehr auf Eingaben reagiert. ___ tag123vb6 ___ Visual Basic 6.0 (VB6) war die letzte COM-basierte Version der VB-Programmiersprache und IDE, zuletzt 2004 aktualisiert. Es ist der * Vorgänger * der modernen VB.NET. ___
SPE 19.04.2012 14:19
quelle
2

Ich würde das angehen, indem ich den Code in dem Modul durchforste, den Windows bestimmt hat, und dessen Name in das Ereignisprotokoll geschrieben wurde. Der Versuch, mehr Details im Hängeereignis zu erhalten, ist nicht möglich, da, wenn Windows festgestellt hat, dass die App nicht mehr reagiert, es zu spät ist.

In das hängende Modul würde ich DoEvents mehrere Aufrufe hinzufügen und Statusmeldungen direkt im EventLog protokollieren. Wenn Sie an dieser Stelle ein Protokollierungsframework hinzufügen, führt dies zu Komplexität und erfordert entweder einen Datenbank- oder Dateizugriff, in dem die Protokolle gespeichert werden.

Windows denkt, dass die App nicht mehr reagiert, weil sie nicht mehr auf Nachrichten reagiert. Leider ist das Implementieren eines zweiten Threads in Ihrer VB6-Anwendung im Gegensatz zu .NET nicht trivial. Nichtsdestoweniger würde das Hinzufügen eines anderen Threads die App ansprechen lassen, aber dann wäre es wahrscheinlich immer noch die Frage zu beantworten: "Warum dauert die Ausführung des Codes so lange?"

    
Brian Leeming 19.04.2012 19:24
quelle
0

Das Erhalten von Informationen aus der Windows-Ereignisperspektive wird nicht helfen. Versuchen Sie, Tracing in Ihrer Anwendung zu haben, die Ihnen hilft, die genaue Ursache zu finden.

    
NoDisplay 26.04.2012 11:39
quelle

Tags und Links