Wie nähern Sie sich intermittierende Fehler?

stimmen
31

Szenario

Sie haben Berichte mehrere Fehler haben alle das gleiche Problem zeigt. Sie sind alle kryptischen mit ähnlichen Geschichten, wie das Problem aufgetreten ist. Sie folgen den Schritten, aber es funktioniert nicht zuverlässig das Problem reproduzieren. Nach einigen Untersuchungen und Web-Suche, vermuten Sie, was im Gange sein könnte und Sie sind ziemlich sicher, dass Sie das Problem beheben können.

Problem

Leider ohne eine zuverlässige Art und Weise das ursprüngliche Problem zu reproduzieren, können Sie nicht überprüfen, ob es tatsächlich das Problem behebt, anstatt überhaupt keine Wirkung oder Verschlimmerung und das eigentliche Problem zu maskieren. Sie könnten nur reparieren es nicht, bis es reproduzierbar jedes Mal wird, aber es ist ein großer Fehler und nicht die Festsetzung es Ihre Benutzer eine Menge anderer Probleme verursachen würde.

Frage

Wie gehen Sie über Ihre Änderung zu überprüfen?

Ich denke, dies ist ein sehr bekanntes Szenario für jeden ist, Software entwickelt hat, so bin ich sicher, dass eine Vielzahl von Ansätzen und Best Practices zur Bewältigung Fehler wie diese sind. Wir suchen zur Zeit an einem dieser Probleme auf unserem Projekt, wo ich einige Zeit damit verbracht haben, das Problem der Bestimmung aber nicht gelungen, meinen Verdacht zu bestätigen. Ein Kollege ist einweichen-Prüfung meines fix in der Hoffnung, dass „ein Tag ohne einen Absturz des Laufens“ zu gleichsetzt „es ist behoben“. Allerdings würde ich einen zuverlässigere Ansatz bevorzugen und ich dachte, eine Fülle von Erfahrungen gibt es hier auf SO.

Veröffentlicht am 09/12/2008 um 15:31
quelle vom benutzer
In anderen Sprachen...                            


18 antworten

stimmen
4

Es gibt keine eine Antwort auf dieses Problem. Manchmal ist die Lösung, die Sie gefunden haben, hilft Ihnen das Szenario herauszufinden, das Problem zu reproduzieren, in dem Fall, dass Sie dieses Szenario vor und nach dem Update testen. Manchmal, wenn diese Lösung nur gefunden habe behebt eines der Probleme, aber nicht alle von ihnen, oder wie Sie sagen Masken ein tiefer liegendes Problem. Ich wünschte, ich könnte sagen, „dies tun, es funktioniert jedes Mal“, aber es gibt keine „dieses“, dass dieses Szenario paßt.

Beantwortet am 09/12/2008 um 15:39
quelle vom benutzer

stimmen
5

Instrument der Build mit umfangreicher (möglicherweise optional) Protokollierung und Datenspeicherung, die exakte Wiedergabe der variablen UI ermöglicht die Schritte der Benutzer nahm vor dem Absturz aufgetreten.

Wenn das Datum, die Sie nicht zuverlässig ermöglichen, das Problem zu reproduzieren, dann haben Sie die Klasse der Fehler verringert. Zeit bei Quellen zufälligen Verhaltens zu suchen, wie Variationen in der Systemkonfiguration, Zeiger Vergleiche, nicht initialisierte Daten usw.

Manchmal „wissen“ Sie (oder eher das Gefühl), dass Sie das Problem ohne umfangreiche Tests oder Unit-Tests Gerüst beheben können, weil Sie wirklich das Problem zu verstehen. Allerdings, wenn Sie dies nicht tun, ist es sehr oft läuft darauf hinaus, etwas nach unten, wie „wir es 100-mal liefen und der Fehler nicht mehr aufgetreten, so dass wir es bis zum nächsten Mal fixiert halten es berichtet wird.“.

Beantwortet am 09/12/2008 um 15:39
quelle vom benutzer

stimmen
7

Sie werden nie ohne die Identifizierung der Ursache um das Update überprüfen zu können, und mit einem zuverlässigen Weg kommen, um den Fehler zu reproduzieren.

Für die Ursache zu identifizieren: Wenn Ihre Plattform erlaubt es, Haken einig Post-Mortem-Debugging in das Problem.

Zum Beispiel unter Windows, erhalten Sie Ihren Code, um eine Minidump-Datei (Core Dump auf Unix) zu erstellen, wenn es um dieses Problem auftritt. Sie können dann erhalten die Kunden (oder WinQual, unter Windows) Sie diese Datei zu senden. Dies sollten Sie mehr Informationen geben, wie Ihr Code ist auf dem Produktionssystem schief gegangen.

Aber ohne dass, werden Sie noch brauchen eine zuverlässige Art und Weise zu entwickeln, um den Fehler zu reproduzieren. Sonst wirst du nie in der Lage sein zu überprüfen, ob es behoben ist.

Selbst mit all diesen Informationen können Sie einen Fehler am Ende Fixierung, die aussieht wie, aber nicht diejenige, die der Kunde zu sehen ist.

Beantwortet am 09/12/2008 um 15:40
quelle vom benutzer

stimmen
12

Bugs, die schwer zu reproduzieren sind, ist am schwierigsten zu lösen. Was Sie brauchen, um sicherzustellen, dass Sie die Wurzel des Problems gefunden haben, auch wenn sich das Problem nicht erfolgreich reproduziert werden kann.

Die häufigsten intermittierenden Fehler werden durch Rennbedingungen verursacht - durch das Rennen zu beseitigen, oder um sicherzustellen, dass eine Seite gewinnt immer Sie die Wurzel des Problems selbst beseitigt haben, wenn Sie es nicht erfolgreich bestätigen können, indem die Ergebnisse zu testen. Das einzige, was Sie testen können, ist, dass die Ursache selbst braucht wiederholen.

Manchmal reparieren, was in der Tat als die Wurzel zu sehen ist ein Problem löst aber nicht das richtige - da ist es nicht zu vermeiden. Der beste Weg, intermittierende Fehler zu vermeiden, ist mit dem System-Design und Architektur vorsichtig und methodisch sein.

Beantwortet am 09/12/2008 um 15:40
quelle vom benutzer

stimmen
1

Diese Arten von Fehlern sind sehr frustrierend. Extrapoliert sie aus unterschiedlichen Maschinen mit verschiedenen Arten von benutzerdefinierter Hardware, die in ihnen sein könnte (wie bei meiner Firma) und Junge, Junge wird sie zu einem Alptraum. Im Moment habe ich einige Fehler, wie dies zur Zeit in meinem Job.

Meine Faustregel: Ich repariere es nicht, wenn ich es selbst reproduzieren kann, oder ich mit einem log präsentiert, die eindeutig etwas falsch zeigt. Ansonsten kann ich meine Änderung nicht überprüfen, noch kann ich sicherstellen, dass Veränderung etwas anderes nicht gebrochen hat. Natürlich ist es nur eine Faustregel gilt: - I Ausnahmen machen tun.

Ich glaube, Sie haben recht mit Ihrer colleuge Ansatz zur Beunruhigung.

Beantwortet am 09/12/2008 um 15:44
quelle vom benutzer

stimmen
0

Diese Probleme haben immer verursacht durch:

  1. Probleme mit dem Speicher
  2. Threading Probleme

Um das Problem zu lösen, sollten Sie:

  • Instrument Code (Add Log-Anweisungen)
  • Code Review Einfädeln
  • Code Review Speicherzuweisung / dereferencing

Der Code-Reviews wird höchstwahrscheinlich nur passieren, wenn es eine Priorität ist, oder wenn Sie einen starken Verdacht haben, über den Code durch die mehrere Fehlerberichte geteilt wird. Wenn es ein Threading-Problem ist, dann überprüfen Sie die Thread-Sicherheit - stellen Sie sicher, Variablen zugänglich von beiden Threads geschützt sind. Wenn es sich um ein Speicherproblem ist, dann Zuweisungen und Dereferenzierungen überprüfen und vor allem von Code verdächtig sein, der Speicher reserviert und zurückgibt, oder Code, der von jemand anderem Speicherzuweisung verwendet, die sie veröffentlichen kann.

Beantwortet am 09/12/2008 um 15:47
quelle vom benutzer

stimmen
5

Ich verwende , was ich als „schweren Stil defensive Programmierung“ : fügen Sie behauptet , in allen Modulen, die von dem Problem verbunden zu sein scheint. Was ich meine ist, fügen Sie eine Menge von behauptet , behauptet Beweise, behaupten Zustand der Objekte in allen ihren memebers, behaupten „environnement“ Zustand, usw.

Behauptet, helfen Sie den Code zu identifizieren, die nicht zu dem Problem verbunden ist.

Die meiste Zeit finde ich den Ursprung des Problems nur durch die Behauptungen zu schreiben, wie es Sie zwingt alle den Code neu zu lesen und unter den Eingeweiden der Anwendung plundge es zu verstehen.

Beantwortet am 09/12/2008 um 15:47
quelle vom benutzer

stimmen
1

In dieser Situation, wo es nicht anders geht, stelle ich zusätzliche Protokollierung.

Ich füge auch in E-Mail-Benachrichtigungen, die mir den Zustand der Anwendung zeigen, wenn es zusammenbricht.

Manchmal füge ich in Leistungsindikatoren ... Ich habe die Daten in einer Tabelle und Trends suchen.

Auch wenn nichts auftaucht, werden Sie die Dinge nach unten verengenden. Eine oder andere Weise, Sie werden sie mit nützlichen Theorien beenden.

Beantwortet am 09/12/2008 um 15:47
quelle vom benutzer

stimmen
2

Zuerst müssen Sie Stack-Traces von Ihren Kunden zu bekommen, auf diese Weise einige Forensik tatsächlich tun können.

Weiter Fuzz Tests mit zufälliger Eingabe zu tun, und diese Tests für lange Strecken laufen zu halten, sind sie groß an jenen irrationale Grenze Fälle zu finden, dass die menschlichen Programmierer und Tester durch Use Cases und das Verständnis des Codes finden.

Beantwortet am 09/12/2008 um 15:48
quelle vom benutzer

stimmen
1

Einige Fragen, die Sie sich stellen könnten:

  • Wann hat dieses Stück Code letzte Arbeit ohne Problem.
  • Was getan wurde, da es aufgehört zu arbeiten.

Wenn der Code nicht der Ansatz gearbeitet würde natürlich anders sein.

Zumindest, wenn viele Benutzer eine Menge Code die ganze Zeit ändern, ist dies ein sehr häufiges Szenario.

Beantwortet am 09/12/2008 um 15:53
quelle vom benutzer

stimmen
1

Dies sind schrecklich und fast immer resistent gegen die ‚Korrekturen‘ der Ingenieur denkt, er setzt in, wie sie sich zur Gewohnheit zurückzukommen haben Monate zu beißen später. Seien Sie vorsichtig bei allen intermittierenden Fehler gemacht Behebungen. Seien Sie bereit für ein bisschen Grunzenarbeit und intensive Protokollierung hergestellt, wie dies eher ein Testproblem klingt als ein Entwicklungsproblem.

Mein eigenes Problem, wenn die Überwindung Fehler wie diese war, dass ich auf das Problem oft zu nahe war, nicht zurück und schaut auf das größere Bild stehen. Versuchen Sie, jemand anderes zu sehen, wie man das Problem angehen.

Insbesondere war mein Fehler bei der Einstellung von Timeouts und verschiedenen anderen magischer Zahlen zu tun, dass im Nachhinein wo grenzwertig und so arbeitete fast die ganze Zeit. Der Trick in meinem Fall war viel Experimentieren mit Einstellungen zu tun, die ich herausfinden konnte, was würde Werte ‚Bruch‘ der Software.

die Ausfälle Sie während bestimmter Zeitperioden geschehen? Wenn ja, wo und wann? Ist es nur bestimmte Personen, die den Fehler zu reproduzieren scheinen? Welche Menge von Eingaben scheinen das Problem zu laden? Welcher Teil der Anwendung ist es nicht auf? Scheint der Fehler mehr oder weniger intermittierender auf dem Feld?

Als ich ein Software-Tester meine wichtigsten Werkzeuge war, wo ein Stift und Papier Notizen meiner bisherigen Aktionen aufzeichnen - eine Menge scheinbar unbedeutende Details erinnern, ist von entscheidender Bedeutung. Durch die Beobachtung und das Sammeln wenig Bits von Daten die ganze Zeit wird der Bug zu werden scheinen weniger intermittierend.

Beantwortet am 09/12/2008 um 16:17
quelle vom benutzer

stimmen
1

Spezifisches Szenario

Während ich nur konzentrieren wollen nicht auf die Frage, die ich hier habe einige Details der aktuellen Ausgabe der wir stehen und wie ich es bisher in Angriff genommen habe.

Das Problem tritt auf, wenn der Benutzer mit der Benutzerschnittstelle interagiert (a TabControl um genau zu sein) in einer bestimmten Phase eines Prozesses. Es muss nicht immer auftreten, und ich glaube, das liegt daran, dass das Zeitfenster für das Problem klein wird ausgestellt ist. Mein Verdacht ist, dass die Initialisierung eines Usercontrol (wir sind in .NET, C #) fällt zusammen mit einer Zustandsänderungsereignis aus einem anderen Bereich der Anwendung, die eine Schrift führt angeordnet ist. Inzwischen eine andere Steuerung (ein Label) versucht, seine Zeichenfolge mit dieser Schriftart zu ziehen und damit den Absturz.

Allerdings bestätigt eigentlich, was führt zu der Schrift angeordnet ist, hat sich als schwierig erwiesen. Das aktuelle Update wurde die Schriftart zu klonen, so dass die Zeichnung Etikett noch eine gültige Schriftart hat, aber das ist wirklich maskiert das eigentliche Problem, das ist die Schrift in erster Linie angeordnet ist. Offensichtlich würde ich die vollständige Sequenz auf die Spur mögen, aber das erweist sich als sehr schwierig, und die Zeit ist kurz.

Ansatz

Mein Ansatz war zunächst an dem Stack-Trace aus unseren Crash-Berichten schauen und den Microsoft-Code mit Reflektor zu untersuchen. Leider führte dies zu einem GDI + Aufruf mit wenig Dokumentation, die nur eine Nummer für den Fehler zurückgibt - .NET verwandelt sich diese in eine ziemlich nutzlos Meldung, etwas ungültig ist. Groß.

Von dort ging ich zu welchem ​​Anruf in unserem Code suchen, um dieses Problem führt. Der Stapel beginnt mit einer Nachrichtenschleife, nicht in unserem Code, aber ich finde einen Aufruf Update () in dem allgemeinen Bereich unter Verdacht und, Instrumentierung (Spuren, etc.) verwendete, konnten wir etwa 75% iger Sicherheit bestätigen, dass diese war die Quelle der Farbe Nachricht. Es ist jedoch nicht die Quelle des Fehlers war - fragen Sie das Etikett zu malen ist kein Verbrechen.

Von dort schaute ich auf jeden Aspekt des Lackes Anruf, stürzte (DrawString), um zu sehen, was ungültig sein könnte und begann jeden auszuschließen, bis er auf den Einwegartikel fiel. Ich bestimmt dann, welche davon wir die Kontrolle über und die Schrift war die einzige hatte. Also nahm ich einen Blick darauf, wie wir die Schrift behandelt und unter welchen Umständen wir sie angeordnet sind, um mögliche Ursachen zu identifizieren. Ich konnte eine plausible Abfolge von Ereignissen zu entwickeln, die die Berichte von den Benutzern passen, und daher in der Lage ein geringes Risiko fix zu codieren.

Natürlich überquerte es meiner Meinung nach, dass der Fehler im Rahmen war, aber Ich mag wir, bevor er die Schuld an Microsoft vermasselt zu übernehmen.

Fazit

Also, das ist, wie ich ein besonderes Beispiel für diese Art von Problem genähert. Wie Sie sehen können, ist es weniger als ideal, aber passt mit dem, was viele gesagt haben.

Beantwortet am 09/12/2008 um 16:21
quelle vom benutzer

stimmen
1

Für einen schwer zu reproduzierende Fehlern, ist der erste Schritt in der Regel Dokumentation. Im Bereich des Codes, der, ändern Sie den Code sein hyper ausdrücklich versagt: Ein Befehl pro Zeile; schwer, differenzierte Ausnahmebehandlung; ausführlich, auch weitschweifig Debug-Ausgabe. Auf diese Weise, auch wenn Sie nicht den Fehler reproduzieren oder beheben können, können Sie das Scheitern weit mehr Informationen über die Ursache die nächste Zeit gewinnen ist zu sehen.

Der zweite Schritt ist in der Regel Behauptung von Annahmen und Grenzen Prüfung. Alles denken Sie über den Code in Frage wissen, schreiben .Asserts und Schecks. Insbesondere überprüfen Objekte für Nichtigkeits- und (wenn Ihre Sprache ist dynamisch) Existenz.

Drittens prüfen Sie Ihre Einheit Testabdeckung. Sie Komponententests decken tatsächlich jede Gabel in der Ausführung? Wenn Sie nicht Unit-Tests haben, ist dies wahrscheinlich ein guter Anfang.

Das Problem mit den nicht reproduzierbaren Fehler ist, dass sie in den Entwickler nur unreproducible sind. Wenn Endbenutzer auf reproduzieren sie darauf bestehen, dann ist es ein wertvolles Werkzeug, um den Absturz auf dem Gebiet zu nutzen.

Beantwortet am 09/12/2008 um 18:19
quelle vom benutzer

stimmen
2

Sie sagen, in einem Kommentar, dass Sie denken, es ist eine Race-Bedingung. Wenn Sie denken, Sie wissen, was „Feature“ von der Code die Bedingung erzeugt, können Sie einen Test schreiben, um zu versuchen, es zu erzwingen.

Hier ist etwas riskanter Code in c:

const int NITER = 1000;
int thread_unsafe_count = 0;
int thread_unsafe_tracker = 0;

void* thread_unsafe_plus(void *a){
  int i, local;
  thread_unsafe_tracker++;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local++;
    thread_unsafe_count+=local;
  };
}
void* thread_unsafe_minus(void *a){
  int i, local;
  thread_unsafe_tracker--;
  for (i=0; i<NITER; i++){
    local = thread_unsafe_count;
    local--;
    thread_unsafe_count+=local;
  };
}

die kann ich testen, (in einem pThreads enironment) mit:

pthread_t th1, th2;
pthread_create(&th1,NULL,&thread_unsafe_plus,NULL);
pthread_create(&th2,NULL,&thread_unsafe_minus,NULL);
pthread_join(th1,NULL);
pthread_join(th2,NULL);
if (thread_unsafe_count != 0) {
  printf("Ah ha!\n");
}

Im wirklichen Leben, haben Sie wahrscheinlich Ihre verdächtigen Code in irgendeiner Weise wickeln das Rennen schlagen mehr ofter zu helfen.

Wenn es funktioniert, stellen Sie die Anzahl der Threads und andere Parameter traf es die meiste Zeit zu machen, und jetzt haben Sie eine Chance.

Beantwortet am 09/12/2008 um 18:24
quelle vom benutzer

stimmen
1

Ich habe in Bugs auf Systemen laufen, die konsequent zu Fehlern führen scheinen, aber wenn in einem Debugger das Problem verschwindet auf mysteriöse Weise durch den Code zu treten. In all diesen Fällen war die Frage ein Timing.

Wenn das System läuft normal war es irgendeine Art von Konflikt um Ressourcen oder den nächsten Schritt, bevor die letzten beendet. Wenn ich durch sie im Debugger trat, besser könnte es langsam genug bewegt, dass das Problem verschwunden.

Nachdem ich herausgefunden war es ein Timing-Problem war es leicht, eine Lösung zu finden. Ich bin mir nicht sicher, ob dies in Ihrer Situation anwendbar ist, aber wenn Fehler im Debugger Timing-Probleme sind meine erst Verdächtigen verschwinden.

Beantwortet am 09/12/2008 um 18:32
quelle vom benutzer

stimmen
0

Es sei denn, es große Zeitdruck sind, beginne ich keine Änderungen zu testen, bis ich das Problem zuverlässig reproduzieren kann.

Wenn Sie wirklich hatte, ich nehme an, Sie könnten einen Testfall schreiben, die manchmal scheint das Problem auslösen, und fügen Sie ihn in Ihre automatisierten Test-Suite (Sie eine automatisierte Testsuite haben, nicht wahr?), Und dann ändern machen und Hoffnung dass Testfall versagt nie wieder, dass zu wissen, wenn Sie nicht wirklich etwas zumindest jetzt fix haben Sie mehr Chancen, fangen sie haben. Aber von der Zeit können Sie einen Testfall schreiben, Sie fast immer Dinge auf den Punkt reduziert nach unten, wo Sie nicht mehr den Umgang mit einer solchen (scheinbar) nicht-deterministische Situation.

Beantwortet am 09/12/2008 um 19:06
quelle vom benutzer

stimmen
0

Sobald Sie vollständig den Fehler (und das ist ein großer „once“) zu verstehen, sollten Sie in der Lage sein, es nach Belieben zu reproduzieren. Wenn der Wiedergabecode (automatisierter Test) geschrieben wird, beheben Sie den Fehler.

Wie kommt man zum Punkt, wo Sie den Fehler zu verstehen?

Instrument der Code (log wie verrückt). Arbeiten Sie mit Ihrem QA - sie sind gut darin neu zu erstellen, um das Problem, und Sie müssen arrangieren voll dev-Toolkit zur Verfügung zu haben, auf ihren Maschinen. Verwenden Sie automatisierte Tools für nicht initialisierten Speicher / Ressourcen. starrt einfach nur auf dem Code. Keine einfache Lösung gibt.

Beantwortet am 09/12/2008 um 19:56
quelle vom benutzer

stimmen
0

Einfach gesagt: den Benutzer fragen, wer es berichtet.

Ich benutze nur einer der Reporter als Verifikationssystem. Normalerweise ist die Person, die bereit war, einen Fehler zu melden ist mehr als glücklich zu helfen, ihr Problem zu lösen [1]. gibt ihnen einfach Ihre Version mit einem möglichen fix und fragen, ob das Problem verschwunden ist. In Fällen, in denen der Fehler eine Regression ist, kann das gleiche Verfahren verwendet werden, um bisect, wo das Problem, indem den Benutzer mit dem Problem, mehr Versionen aufgetreten zu testen. In anderen Fällen kann der Benutzer auch Ihnen helfen, das Problem zu debuggen, indem ihnen eine Version mit mehr Debugging-Funktionen zu geben.

Dies wird an dieser Person keine negativen Effekte aus einer möglichen Korrektur begrenzen, anstatt zu raten, dass etwas den Fehler zu beheben und dann später zu merken, dass Sie haben gerade ein „Bug-Fix“ veröffentlicht, die keine Wirkung oder im schlimmsten Fall ein negativer Effekt für die Systemstabilität.

Sie können auch die möglichen negativen Auswirkungen des „Bug-Fix“ begrenzen, indem Sie die neue Version auf eine begrenzte Anzahl von Benutzern zu geben (zum Beispiel, um alle diejenigen, die das Problem gemeldet) und die Freigabe des Updates erst danach.

Auch können diejenigen, sie bestätigen, dass das Update Sie Arbeiten gemacht haben, ist es einfach, Tests hinzufügen, die sicherstellt, dass Ihre fix im Code (zumindest auf Unit-Test-Niveau bleiben wird, wenn die Fehler nur schwer auf mehr höheren Systemebene zu reproduzieren ).

Natürlich erfordert dies, dass, was auch immer man diese Art von Ansatz arbeitet an unterstützt. Aber wenn es nicht würde ich wirklich tun, was ich kann, um es zu ermöglichen - Endanwender sind zufriedener und viele der schwierigsten Tech-Probleme einfach weg und Prioritäten klar kommen, wenn die Entwicklung direkt mit dem System Endnutzern interagieren kann.

[1] Wenn Sie jemals einen Fehler gemeldet haben, können Sie die meisten wissen wahrscheinlich, dass oft die Antwort von der Entwicklung / Wartungsteam vom Endbenutzer Sicht irgendwie negativ ist oder es wird keine Antwort überhaupt - vor allem in Situationen, in denen die Fehler können nicht durch das Entwicklungsteam reproduziert werden.

Beantwortet am 05/09/2014 um 11:50
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more