2009-06-04 4 views
4

Wir haben eine dotnet 2.0 Desktop Winforms App und es scheint zufällig zu stürzen. keine Stack-Trace, Vent Log oder irgendetwas. es verschwindet nur.Wie Debuggen von zufälligen Abstürzen?

Es gibt einige Theorien:

  1. Maschine einfach aus Ressourcen läuft. Einige Leute haben gesagt, dass Sie immer eine Fenster-Handle-Ausnahme oder eine GDI-Ausnahme erhalten werden, aber andere sagen, dass es einfach zu Abstürzen führen kann.

  2. Wir verwenden Wrapper um nicht verwalteten Code für 2 Module. Ausnahmen in einem dieser Module können dieses Verhalten verursachen.

wieder, das ist ich irgendwelche Vorschläge waren, wie man besser oder etwas debuggen, wenn es sehen, nicht reproduzierbar, so wollte ich kann auf die Maschine setzen zu „fangen“ der Absturz, bevor sie uns helfen zu verstehen, geschieht was geht weiter.

+0

Sind Sie in der Lage in dem Debugger zu laufen oder sind Sie begrenzt Post Mortem Debuggen? –

+0

Ich beschuldige Geister. – Jherico

+0

"Anwendung verschwindet plötzlich ohne Warnung" ist stark symptomatisch für einen Fehler, bei dem die Schutzseite am Ende des Stapels zum zweiten Mal getroffen wird. Das Betriebssystem ist sehr aggressiv, wenn es darum geht, Anwendungen zu entfernen, die den Stack wiederholt beschädigen. Besteht die Möglichkeit, dass der nicht verwaltete Code eine unbegrenzte Rekursion ausführt, die den Stack beschädigt? –

Antwort

2

Sie könnten Process Monitor von SysInternals (jetzt ein Teil von Microsoft) verwendet, um genau das zu filtern, was Sie überwachen möchten. Dies würde Ihnen einen guten Startpunkt geben. Beginnen Sie einfach mit einem engen Fokus oder stellen Sie sicher, dass Sie genügend Platz für die Protokolldatei haben.

0

Haben Sie einen try/catch-Block um die Zeile 'Application.Run', der den GUI-Thread startet? Wenn nicht, fügen Sie eine hinzu und melden Sie sich für alle Ausnahmen an, die dort ausgegeben werden.

Sie können auch das Application.ThreadException-Ereignis aufrufen und protokollieren, falls Sie weitere Hinweise erhalten.

1

ich mit Boydski zustimmen. Aber ich biete diesen Vorschlag auch an. Sehen Sie sich die Threads genau an, wenn Sie Multi-Threading durchführen. Ich hatte einmal einen Fehler wie diesen, der eine lange Zeit brauchte, um es herauszufinden und endete damit, dass John Robbins am Telefon dabei half. Es stellte sich heraus, dass es sich um eine fehlerhafte Ausnahmebehandlung mit Threads handelte.

3

Klingt für mich wie Sie müssen sich zuerst anmelden - vielleicht können Sie mit PostSharp einen Logger an Ihre Methoden (see Log4PostSharp) anhängen. Dies wird Sie sicherlich verlangsamen und Tonnen von Nachrichten produzieren. Aber Sie sollten in der Lage sein, den problematischen Code einzugrenzen ... Fügen Sie dort weitere Protokolle hinzu - entfernen Sie andere. Vielleicht können Sie diese Teile später testen. Wenn die verdächtigen Teile klein genug sind, können Sie sogar eine Code-Überprüfung durchführen.
Ich weiß, Ihre Frage war über Debugging - aber das könnte auch ein Ansatz sein.

+2

Ich stimme zu. Loggen Sie sich Ihren Code ein, dann sollten Sie eine vage Ahnung haben, was kurz vor dem Absturz geschah. Fügen Sie diesem Bereich noch mehr Protokollnachrichten hinzu und führen Sie ihn erneut aus, bis Sie einen Absturz erhalten. Protokolle sind großartige Dinge, und wie Old-School-Programmierer in den Tagen vor IDEs und Debuggern debuggten. :) – abelenky

+0

Und wenn es wirklich abstürzt, ohne catch/finally blocks zu rufen gibt es nicht zu viele andere Optionen ... – tanascius

+0

+1 - Logging ist so viel wert, dass es nicht überschätzt werden kann. –

0

Ich meine Vergangenheit Ich habe diese Art von Verhalten in erster Linie in Bezug auf COM-Objekte nicht freigegeben und/oder Threading-Probleme. Sehen Sie sich die Vorschläge an, die Sie bereits erhalten haben, aber ich würde auch vorschlagen, zu prüfen, ob Sie die nicht verwalteten Objekte ordnungsgemäß freigeben, damit sie keinen Speicherverlust verursachen.