2008-09-30 15 views
6

wir haben ein Problem mit einer Anwendung, die wir entwickeln. Sehr selten, wie einmal in hundert, stürzt die Anwendung beim Start ab. Wenn der Absturz auftritt, wird das gesamte System heruntergefahren, der Computer beginnt zu piepsen und friert vollständig ein. Die einzige Möglichkeit zur Wiederherstellung besteht darin, das Gerät auszuschalten (wir verwenden Windows XP). Die Seltenheit des Absturzes in Verbindung mit der Tatsache, dass wir nicht in den Debugger eindringen oder sogar einen Stackdump erzeugen können, macht es extrem schwierig zu debuggen.Protokollieren/Überwachen aller Funktionsaufrufe von einer Anwendung

Ich bin auf der Suche nach etwas, das alle Funktionsaufrufe in eine Datei protokolliert. Existiert ein solches Tool? Es sollte nicht unmöglich sein zu implementieren, Profiler wie VTune macht etwas sehr ähnliches.

Wir verwenden Visual Studio 2008 (C++).

Dank

A. B.

Antwort

0

GCC (einschließlich der Version MingGW for Windows development) eine Codegenerierung Schalter namens -finstrument-functions, die die Compiler um jeden Funktionsaufruf spezielle Anrufe Funktionen aufgerufen __cyg_profile_func_enter und __cyg_profile_func_exit auszusenden erzählt. Für Visual C++ gibt es ähnliche Optionen, die /GH und /Gh genannt werden. Diese bewirken, dass der Compiler Aufrufe an __penter und __pexit um Funktionsaufrufe herum ausgibt.

Diese Instrumentierungsmodi können zum Implementieren eines Protokollierungssystems verwendet werden, wobei Sie die Aufrufe implementieren, die der Compiler zur Ausgabe an Ihr lokales Dateisystem oder an einen anderen Computer in Ihrem Netzwerk generiert.

Wenn möglich, würde ich auch versuchen, Ihr System mit valgrind oder einem ähnlichen Prüfwerkzeug laufen zu lassen. Dies könnte Ihr Problem auffangen, bevor es außer Kontrolle gerät.

2

Das einzige Problem mit der Logging-Idee ist, dass, wenn das System abstürzt, noch die neuesten Protokolleinträge im Cache sein könnten und haben keine Chance auf der Festplatte ...

Wenn es nach mir

geschrieben werden sollte, würde ich versuchen Sie, das Programm auf einem anderen PC auszuführen - es könnte flockige Hardware oder Treiber sein, die das Problem verursachen. Ein Anwendungsprogramm "sollte" das System nicht zum Absturz bringen können.

2

Ein paar Ideen-
Es gibt eine gute Chance, dass kurz vor Ihrem Absturz eine Art Ausnahme in der Anwendung ist. Wenn Sie den Handler für alle nicht behandelten Ausnahmen mithilfe von SetUnhandledExceptionFilter() festlegen und eine Stapelprotokollierung in Ihre Protokolldatei schreiben, besteht die Möglichkeit, den Absturz in Aktion zu erfassen.
Denken Sie daran, die Datei nach jedem Schreiben zu löschen.

Eine weitere Option ist ein Tool wie strace, das alle Systemaufrufe in den Kernel protokolliert (es gibt mehrere Varianten und Implementierungen dafür, also wählen Sie Ihren Favoriten). Wenn Sie sich das Protokoll kurz vor dem Absturz ansehen, finden Sie möglicherweise den Schuldigen

+0

Danke für die strikte Verbindung. – Constantin

3

Logging-Funktion Einträge/Exits ist eine Low-Level-Ansatz für Ihr Problem. Ich würde vorschlagen, automatische Debugger-Instrumentierung (mit Debugger-Schlüssel unter Image File Execution Optionen mit regedit oder mit gflags aus dem Paket, das ich einen Link zu bieten unten) und versuchen, das Problem bis zum Absturz zu reproduzieren.Darüber hinaus können Sie die Protokollfunktion der Debugger-Protokollfunktion eines oder mehrerer verdächtiger Module mit einem Skript aufrufen oder andere Informationen sammeln.
Aber ohne die Details Ihrer Anwendung zu kennen, ist es sehr schwer, eine Lösung vorzuschlagen. Ist es eine Benutzer-App, ein Dienst oder ein Treiber? Was bedeutet "stürzt beim Start" ab - beim Windows-Start oder beim Start der App?
Verwenden Sie diese debugger package zur Fehlerbehebung.

2

Haben Sie in Erwägung gezogen, eine zweite Maschine als Remote-Debugger zu verwenden (über das Netzwerk)? Wenn die Anwendung (und das System) abstürzt, sollte die zweite Maschine noch einige nützliche Informationen anzeigen, wenn nicht der eigentliche Punkt des Problems. Ich glaube VC++ hat diese Fähigkeit zumindest in einigen Versionen.

Verwandte Themen