Zufällige Abstürze beheben
Ich bin immer zufällige Abstürze auf meinem C++ - Anwendung, es kann nicht Abstürzen, für einen Monat, und dann crash 10 mal in einer Stunde, und manchmal kann es zum Absturz beim starten, während manchmal kann es zum Absturz nach einigen Stunden Betrieb (oder nicht-crash).
Ich benutze GCC unter GNU/Linux und MingW unter Windows, daher kann ich nicht verwenden, die Visual Studio JIT-Debuggen...
Ich habe keine Idee, wie Sie Vorgehen sollen, suchen zufällig auf den code würde nicht funktionieren, der code ist RIESIG (und das gute Teil war nicht mein Werk, hat es auch einige gute Menge von legacy-Zeug), und ich habe auch keine Ahnung haben, wie reproduzieren Sie den Absturz.
EDIT: Viele Leute erwähnt, dass..., wie mache ich einen core dump, minidump oder whateverdump? Dies ist die erste Zeit, die ich brauche post-mortem-debugging.
EDIT2: Tatsächlich, DrMingw erfasst eine call-stack, kein memory-info... Leider, den call-stack nicht half mir viel, denn in der Nähe des Ende, als es plötzlich gehen Sie in eine Bibliothek (oder so), dass ich nicht die debug-info, die sich nur in einige hexadezimale zahlen... So ich muss noch ein paar anständige dump, gibt mehr Informationen (speziell über das, was war in der Erinnerung... speziell, was war in dem Ort gab, dass der "access violation" - Fehler)
Außerdem ist meine Anwendung verwenden Lua und Luabind, vielleicht der Fehler wird verursacht durch ein .lua-Skript, aber ich habe keine Idee, wie zu Debuggen.
InformationsquelleAutor der Frage speeder | 2010-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Valgrind (es ist kostenlos, open-source):
Die Valgrind-Häufig Gestellte Fragen
Den Memcheck Teil des Pakets ist wahrscheinlich der Ort, um zu starten:
InformationsquelleAutor der Antwort Mitch Wheat
Ersten, Sie sind glücklich, dass Ihr Prozess stürzt ab, mehrere Male in einem kurzen Zeitraum. Das sollte es einfach machen, zu gehen.
Dies ist, wie Sie gehen.
Bekommen einen crash-dump
Erste, die Sie wirklich brauchen, um einen crash-dump.
Wenn Sie nicht bekommen, crash-dumps, wenn er abstürzt, starten Sie mit dem schreiben einen test, produziert zuverlässige crash-dumps.
Re-kompilieren der binaries mit debug-Symbolen, oder stellen Sie sicher, dass Sie analysieren können, die crash-dump mit debug-Symbolen.
Finden verdächtige Funktionen
Gegeben, dass Sie einen crash-dump, betrachten Sie es in gdb oder Ihre Lieblings-debugger und denken Sie daran, um zu zeigen, alle threads! Könnte es nicht sein, den Faden, den Sie sehen in der gdb ist buggy.
Suchen, bei denen der gdb sagt Ihre binäre abgestürzt, isolieren einige der Funktionen, die Sie denken, könnte das problem verursachen.
Blick auf mehrere Abstürze und isolieren von code-Abschnitten, die Häufig aktiv in alle Abstürze ist ein echter time-saver.
Verschärfung der staatlichen Kontrolle
Einem Absturz in der Regel geschieht, weil einige inkonsistenten Zustand. Der beste Weg zu gehen ist oft die Verschärfung der staatlichen Anforderungen. Sie tun dies in der folgenden Weise.
Für jede Funktion, die Sie denken, könnte das problem verursachen, zu dokumentieren, welchen rechtlichen Status die Eingabe oder das Objekt muss bei der Einreise in die Funktion. (Machen Sie dasselbe für welchen gesetzlichen Zustand es müssen beim verlassen der Funktion, aber das ist nicht so wichtig).
Wenn die Funktion enthält eine Schleife, ein Dokument der rechtlichen Zustand, den es braucht, um am Anfang jeder loop-iteration.
Fügen Sie behauptet, für alle solche Ausdrücke Rechtsstaat.
Wiederholen
Dann wiederholen Sie den Vorgang. Wenn es immer noch Abstürze außerhalb von Ihr behauptet, ziehen Sie die Bestätigungen weiter. Irgendwann wird der Prozess Abstürzen auf einem behaupten, und nicht wegen einiger zufälliger Absturz. An dieser Stelle können Sie sich konzentrieren auf den Versuch, um herauszufinden, was an deinem Programm gehen von einem Rechtsstaat bei der Einreise in die Funktion, die auf eine rechtswidrige Zustand an der Stelle, wo die Geltendmachung passiert.
Wenn du ein paar der behauptet, wobei Sie die ausführliche Protokollierung sollte es einfacher sein, zu Folgen, was das Programm tut.
InformationsquelleAutor der Antwort user239558
Wenn alle Stricke reißen (besonders wenn die Leistung unter dem debugger ist nicht akzeptabel), umfangreiches logging. Beginnen Sie mit dem Eintrag Punkte -- ist die app transaktionale? Melden Sie jede Transaktion, wie es kommt in. Melden Sie sich für alle der Konstruktor ruft für Ihre wichtigsten Gegenstände. Seit dem Absturz ist so sporadisch Auftritt, melden Sie Anrufe auf alle Funktionen, die möglicherweise nicht aufgerufen werden, jeden Tag.
Wirst du zumindest eingrenzen, wo der Absturz könnte werden.
InformationsquelleAutor der Antwort Nicholas Knight
Starten Sie das Programm unter einem debugger (ich bin sicher, es gibt einen debugger zusammen mit GCC und MingW) und warten, bis es stürzt unter debugger. An der Stelle des Absturzes werden Sie in der Lage, um zu sehen, was bestimmte Aktion fehlschlägt, suchen Sie in Assembler-code, registriert, memory-Status - dies wird oft helfen, finden Sie die Ursache des Problems.
InformationsquelleAutor der Antwort sharptooth
Wo ich arbeite, Absturz Programme in der Regel erzeugt einen core-dump-Datei, die geladen werden können, in windbg.
Wir haben dann ein Bild der Erinnerung an die Zeit, die das Programm abgestürzt. Da gibt es nicht viel Sie tun können, aber wenigstens gibt es Sie die letzten call-stack. Sobald Sie wissen, die Funktion, die abgestürzt ist, dann könnten Sie in der Lage sein auf die Spur, die das problem zumindest reduzieren könnte, das problem auf eine mehr reproductible test-Fall.
InformationsquelleAutor der Antwort ereOn
Diese Art von bugs sind immer schwierig - es sei denn, Sie den Fehler reproduzieren können, dann ist Ihre einzige option, um änderungen an Ihrer Anwendung, so dass zusätzliche Informationen, die angemeldet ist, und dann warten, bis die Fehler wieder passiert, in der wildnis.
Gibt es ein hervorragendes tool namens Process Dumper, die Sie verwenden können, erhalten Sie einen crash-dump von einem Prozess, der Erfahrungen eine Ausnahme oder wird unerwartet beendet - Sie konnten die Benutzer bitten, zu installieren, und konfigurieren Sie Regeln für Ihre Anwendung.
Alternativ, wenn Sie nicht möchten, bitten Sie die Benutzer zum installieren von anderen Anwendungen Sie können Ihre Anwendung überwachen, für die Sie Ausnahmen und erstellen Sie eine dump selbst durch den Aufruf MiniDumpWriteDump.
Die andere option ist die Verbesserung der Protokollierung, allerdings herauszufinden, welche Informationen zu melden (ohne Anmeldung alles) kann schwierig sein, und so kann es mehrere Iterationen crash - ändern Protokollierung auf die Jagd nach dem problem.
Wie gesagt, diese Art von bugs sind immer schwierig zu diagnostizieren - in meiner Erfahrung ist es im Allgemeinen betrifft die Stunden und Stunden der peering durch Protokolle und crash-dumps, bis plötzlich, dass Sie eureka moment, wo alles Sinn macht - der Schlüssel ist die Erhebung der Informationen.
InformationsquelleAutor der Antwort Justin
Es klingt wie dein Programm ist, das leiden von memory-corruption. Wie bereits gesagt, ist die beste option, unter Linux ist wahrscheinlich valgrind. Aber hier sind zwei andere Optionen:
Zunächst verwenden Sie eine debug-malloc. Fast alle C-Bibliotheken bieten eine debug-malloc Implementierung, die Speicher initialisieren (normale malloc hält "alten" Inhalt in der Erinnerung), überprüfen Sie die Grenzen eines reservierten block für Korruption und so weiter. Und wenn das nicht genug ist, gibt es eine große Auswahl an 3rd-party-Implementierungen.
Möchten Sie vielleicht einen Blick auf die VMWare Workstation. Ich habe nicht es so eingerichtet, sondern von Ihren marketing-Materialien unterstützen Sie eine ziemlich interessante Art und Weise zu Debuggen: Führen Sie die debugee in eine "Aufnahme" der virtuellen Maschine. Wenn der Speicher Korruption tritt auf, legen Sie ein memory breakpoint auf die beschädigte Adresse ein dann die Zeit zurück drehen in der VM, um genau diesen moment, wenn, dass Teil des Speichers überschrieben wurde. Sehen dieses PDF, wie setup-replay-debugging mit Linux/gdb. Ich glaube, es ist ein 15-oder 30-Tage-demo für Workstation 7, das ist vielleicht genug, um zu schütteln das dieser Fehler aus dem code.
InformationsquelleAutor der Antwort froh42
Haben Sie schon gehört, wie man diesem unter linux: prüfen Sie core-dumps und ausführen von code unter valgrind. Also dein Erster Schritt könnte sein, die Fehler zu finden, die unter Linux und prüfen Sie dann, wenn Sie verschwinden unter mingw. Denn niemand hat erwähnt Schmutzfänger hier, ich werde es tun: Verwenden Sie mudflap wenn Ihre Linux-distribution versorgt. Schmutzfänger hilft Ihnen, zu fangen, Zeiger Missbrauch und buffer overflows, durch die Erfassung der Daten, wo ein Zeiger ist tatsächlich erlaubt, um zu zeigen:
Und für Windows: Es ist ein JIT-debugger für mingw, genannt DrMingw:
InformationsquelleAutor der Antwort Nordic Mainframe
Führen Sie die Anwendung unter Linux
valgrind
zu suchen, memory-Fehler. Zufällige Abstürze sind in der Regel nach unten zu beschädigen Speicher.Beheben jeden Fehler finden mit valgrind ist memcheck Werkzeug, und dann hoffentlich die crash Weg gehen wird.
Wenn das ganze Programm dauert zu lange laufen, unter valgrind, dann teilen Sie Funktionalität in unit-tests und führen diese unter valgrind, hoffentlich finden Sie die Speicher-Fehler, die die Probleme verursacht.
Wenn es nicht der Fall, dann stellen Sie sicher, dass coredumps aktiviert sind (
ulimit -a
) und wenn dann stürzt es ab, du wirst in der Lage sein, um herauszufinden, wo mitgdb
.InformationsquelleAutor der Antwort Douglas Leeder
Das klingt wie etwas heikles wie eine race-Bedingung.
Ich würde vorschlagen, Sie erstellen Sie ein debug-build und verwenden. Sie sollten auch sicherstellen, dass ein core dump wird erstellt, wenn das Programm abstürzt.
Nächsten mal, wenn das Programm abstürzt, starten Sie den gdb auf der coredump und sehen, wo das problem liegt. Es werde wahrscheinlich eine aufeinander folgende Fehler, aber das sollte Ihnen den Einstieg.
InformationsquelleAutor der Antwort fhd
Das erste, was ich tun würde, ist das Debuggen der core-dump mit gdb (Windows und Linux). Die zweite wäre mit einem Programm wie Flusen, Prefast (Windows), Clang Analyzer oder eine andere statische-Analyse-Programm (seien Sie bereit für eine Menge false-positives). Dritte Sache wäre, eine Art Laufzeit überprüfen, wie Valgrind (oder seine nahen Varianten), Microsoft Application Verifier, oder Google Perftools.
Und Protokollierung. Die haben Sie nicht zu gehen auf der Festplatte. Sie könnten, zum Beispiel, Protokoll zu einem globalen
std::list<std::string>
die würde beschnitten, um die letzten 100 Einträge. Wenn eine Ausnahme aufgefangen wird und zeigt den Inhalt der Liste.InformationsquelleAutor der Antwort Max Lybbert
Starten Sie Die Protokollierung. Legen logging-Anweisungen an Orten, wo Sie denken, dass die code-flockig. Fokus auf den code testen, und wiederholen Sie, bis Sie das problem einzugrenzen, um ein Modul oder eine Funktion.
Setzen Sie behauptet überall!
Während Sie dabei sind, Nur einmal einen Ausdruck in eine assert.
Schreiben Sie einen unit-test für den code, den Sie denken, ist am scheitern. So können Sie die übung, den code in isolation vom rest der Ihre runtime-Umgebung.
Mehr schreiben automatisierte tests, bei denen der problematische code.
Nicht mehr hinzuzufügen-code auf der Oberseite des schlechten code, dass der Fehler aufgetreten ist. Das ist einfach eine dumme Idee.
Lernen, wie zu schreiben, die mini-dumps und die post-mortem-debugging. Es sieht aus wie andere hier erklärt haben, dass das ganz gut.
Ausübung der schlechte code, der aus so vielen verschiedenen Möglichkeiten, wie Sie können, um Sie zu isolieren, den Fehler zu finden.
Verwenden ein debug-build. Führen Sie den debug build im debugger aus, wenn möglich.
Trim down Ihre Anwendung durch entfernen der Binärdateien, Module etc... wenn möglich, so dass Sie es leichter haben, Versuch den Fehler zu reproduzieren.
InformationsquelleAutor der Antwort C Johnson
Gibt es eine Menge gute Antworten hier, aber niemand berührte, über die Lua-Winkel.
Lua ist in der Regel Recht gut benommen, aber es ist immer noch möglich, es auf eine Speicherbeschädigung verursachen oder Abstürzen, wenn z.B. die Lua-stack-overflows oder unter-oder schlecht-bytecode ausgeführt wird.
Eine einfache Sache, die Sie tun können, erkennen viele solcher Fehler zu definieren, die lua_assert makro in luaconf.h. Definieren (z.B. standard-C-s behaupten) wird es ermöglichen, eine Vielzahl von Plausibilitätsprüfungen innerhalb des Lua Kern.
InformationsquelleAutor der Antwort tehtmi
Sie haben wahrscheinlich gemacht einen Speicherfehler, wo Sie einige Werte, um nicht zugewiesenen Speicherplatz irgendwie, es ist ein guter Grund für gelegentliche Abstürze, für eine lange Zeit niemand versucht, zu verwenden, die Speicher, so gibt es keine Fehler, können Sie schauen, wo Sie Speicher und prüfen Sie, wo Sie ausgiebig Zeiger verwenden.
Andere als diese, wie andere hingewiesen, die Sie verwenden sollten, umfangreiches logging, sowohl Bildschirm und Dateien.
InformationsquelleAutor der Antwort LostMohican
Einen basic-check: Stellen Sie sicher, dass Sie tun, eine vollständige Neuerstellung von Ihrem Projekt. Wenn Sie schon tweaken, verschiedene Dateien (insbesondere header-Dateien) und dabei teilweise baut, dann können die Dinge Durcheinander, wenn Sie Ihre build-Abhängigkeiten sind nicht perfekt. Komplett neu nur entfernt die Möglichkeit.
Auch für Windows check-out von Microsoft Debugging tools für Windows, und besonders Ihre gflags tool.
InformationsquelleAutor der Antwort Pierz
Zwei weitere Zeiger/Ideen (neben den core-dump und valgrind unter Linux):
1) Versuchen Sie, die Nokia "Qt Creator". Es unterstützt mingw und kann als post-mortem debugger.
2) Wenn es machbar ist, vielleicht führen Sie einfach die Anwendung in gdb ständig?
InformationsquelleAutor der Antwort Frank Osterfeld
Wenn Ihre Anwendung ist nicht Windows-spezifisch, können Sie versuchen, kompilieren und ausführen Ihres Programms auf andere Plattformen wie Linux (unterschiedliche Verteilung, 32/64 bit, ... wenn du schon den Luxus). Das kann helfen, die Auslöser der Fehler des Programms. Natürlich sollte man die Werkzeuge benutzen, erwähnt in anderen Beiträgen wie z.B. gdb, valgrind, etc..
InformationsquelleAutor der Antwort tofu